栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java Poi Excel使用】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java Poi Excel使用】

文章目录
  • 一、Excel操作
    • 1.获取/创建Sheet页
    • 2. 行&单元格样式
    • 3. 行&单元格
    • 4. 合并单元格
    • 5.移动行(插入行)
    • 6. 方法
    • 7.异常


个人使用记录如有错误欢迎指出

一、Excel操作

根据模板创建一个Excel

	Workbook workbook;
    String classFilePath = "模板路径";
    InputStream in;
    try {
          in = this.getClass().getClassLoader().getResourceAsStream(classFilePath);
          workbook = WorkbookFactory.create(in);
      } catch (Exception e) {
            log.error("读取模板错误:", e);
      }
public static Workbook getWorkbook(InputStream inputStream) throws IOException {
    return WorkbookFactory.create(inputStream);
}

//根据文件后缀名类型获取对应的工作簿对象
public static Workbook getWorkbook(String fileType) throws IOException {
        Workbook workbook;
        if (fileType.equalsIgnoreCase("xls")) {
            workbook = new HSSFWorkbook();
        } else if (fileType.equalsIgnoreCase("xlsx")) {
            workbook = new XSSFWorkbook();
        }else if (fileType.equalsIgnoreCase("et")) {
            workbook = new XSSFWorkbook();
        }else{
            throw new ServiceException(500, "未识别的Excel格式");
        }
        return workbook;
    }
1.获取/创建Sheet页

获取sheet页/创建Sheet页

//根据sheet页名称 获取sheet页
Sheet sheet = workbook.getSheet("sheet页名称");

//根据sheet页的位置获取sheet页  num从1开始
Sheet sheetAt = workbook.getSheetAt(num);

//创建sheet页  sheetName(sheet页名称)
Sheet sheet = workbook.createSheet(sheetName);

//删除sheet页
workbook.removeSheetAt(1);

//sheet页迭代器  按照工作表顺序 item为Sheet
workbook.sheetIterator().forEachRemaining(item->
                                System.out.println(item.getSheetName())
                        );

2. 行&单元格样式
//自适应列宽
sheet.setDefaultColumnWidth(0);
//创建字体样式
Font redFont = workbook.createFont();
//设置字体大小
redFont.setFontHeightInPoints((short) 11);
//字体
redFont.setFontName("仿宋");
//是否加粗
redFont.setBold(true);
//是否斜体
redFont.setItalic(true);
//下划线
redFont.setUnderline((byte) 1);
//设置字体删除线
redFont.setStrikeout(true);
//设置字体上标下标
redFont.setTypeOffset(Font.SS_SUPER);
//颜色 short值
redFont.setColor(Font.COLOR_RED);

//创建一个样式  CellStyle 单元格||行样式
CellStyle redStyle = workbook.createCellStyle();
//设置字体样式
redStyle.setFont(redFont);
//是否自动换行
redStyle.setWrapText(true);
//垂直样式
redStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//水平样式
redStyle.setAlignment(HorizontalAlignment.CENTER);
//边框线条类型
redStyle.setBorderBottom(BorderStyle.MEDIUM);
redStyle.setBorderTop(BorderStyle.MEDIUM);
redStyle.setBorderLeft(BorderStyle.MEDIUM);
redStyle.setBorderRight(BorderStyle.MEDIUM);
//边框线条颜色  IndexedColors
redStyle.setBottomBorderColor((short) 10);
redStyle.setBorderTopColor((short) 10);
redStyle.setBorderLeftColor((short) 10);
redStyle.setBorderRightColor((short) 10);

//设置背景颜色 
style.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

//冻结行和列
sheet.createFreezePane(1, 1);

3. 行&单元格

代码如下(示例):

//获取第num行   num从0开始
Row row = sheet.getRow(num);

//创建行
Row row = sheet.createRow(num);
//删除行 参数类型Row
sheet.removeRow(row)
//行迭代器  item为Row
sheet.rowIterator().forEachRemaining(item-> 
             System.out.println(item.getRowNum())
);
//行样式
//行高
row.setHeightInPoints(56);
//行样式
row.setRowStyle(redStyle);

//获取row行的第cellNum个单元格  cellNum从0开始
Cell cell = row.getCell(cellNum);
//创建单元格
Cell cell = row.createCell(cellNum);
//设置单元格值
cell .setCellValue("单元格值");
//设置单元格样式
cell .setCellStyle(redStyle);

4. 合并单元格

合并单元格后给第一个单元格赋值即可
单元格重复合并会报异常

//这里代表在第n行开始,到n行结束,从m列开始,到m列结束,进行合并,也就是合并第n行的m-m个单元格

CellRangeAddress cellAddresses = new CellRangeAddress(n, n, (short) m, (short) m);
sheet.addMergedRegion(cellAddresses);
//解决合并后边框显示问题  方法见6↓
ExcelUtils.setBorderStyle(BorderStyle.MEDIUM, cellAddresses, sheet);

5.移动行(插入行)

移动行后要创建行,否则行为null

//第三个参数 正数:向下移,负数:向上移
//从n行开始到m行结束,向下移动1行,复制行高,重置原始行高
sheet.shiftRows(n,m,1,true,false);
sheet.createRow(n);
6. 方法
public static void setBorderStyle(BorderStyle border, CellRangeAddress region, Sheet sheet){
     RegionUtil.setBorderBottom(border,region, sheet);
     RegionUtil.setBorderLeft(border,region, sheet);
     RegionUtil.setBorderRight(border,region, sheet);
     RegionUtil.setBorderTop(border,region, sheet);
}


public static CellStyle getCellStyle(Workbook workbook,String font,boolean isAutoLine,boolean isBold,short fontSize
                                  VerticalAlignment verticalAlignment,
                                  HorizontalAlignment horizontalAlignment,
                                  BorderStyle borderBottom,BorderStyle borderTop,
                                  BorderStyle borderLeft,BorderStyle borderRight){
	CellStyle redStyle = workbook.createCellStyle();
	 Font redFont = workbook.createFont();
	 //设置字体大小
	 redFont.setFontHeightInPoints(fontSize);
	 //字体
	 redFont.setFontName(font);
	 //加粗
	 redFont.setBold(isBold);
	 redStyle.setFont(redFont);
	 //自动换行
	 redStyle.setWrapText(isAutoLine);
	 //垂直样式
	 redStyle.setVerticalAlignment(verticalAlignment);
	 //水平样式
	 redStyle.setAlignment(horizontalAlignment);
	 //边框设置
	 redStyle.setBorderBottom(borderBottom);
	 redStyle.setBorderTop(borderTop);
	 redStyle.setBorderLeft(borderLeft);
	 redStyle.setBorderRight(borderRight);
	 return redStyle;
}
7.异常

Cannot add merged region A15:A21 to sheet because it overlaps with an existing merged region (A15:A21).
合并区域重叠,单元格不能重复合并

1)检查是否是代码逻辑导致的重复合并
2)如果需要对已合并的单元格进行再次合并,可以尝试先拆分单元格,重新设定合并区域

// 从第C1开始,拆分单元格
CellReference ref = new CellReference("C1");
//遍历sheet中的所有的合并区域
for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
   String value = "";
   CellRangeAddress region = sheet.getMergedRegion(i);
   Row firstRow = sheet.getRow(region.getFirstRow());
   Cell firstCellOfFirstRow = firstRow.getCell(region.getFirstColumn());
   //如果第一个单元格的是字符串
   if (firstCellOfFirstRow.getCellType() == Cell.CELL_TYPE_STRING) {
       value = firstCellOfFirstRow.getStringCellValue();
   }
   //判断到C1才进行拆分单元格
  	if(region.getFirstRow()==ref.getRow()&®ion.getLastColumn()==ref.getCol(){
   	sheet.removeMergedRegion(i);
   }
   //设置第一行的值为,拆分后的每一行的值
   for (Row row : sheet) {
  		for (Cell cell : row) {
       	if (region.isInRange(cell.getRowIndex(), cell.getColumnIndex())){
               cell.setCellType(Cell.CELL_TYPE_STRING);
               cell.setCellValue(value);
         	}
    	}
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1039016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号