我是靠谱客的博主 贤惠钢铁侠,最近开发中收集的这篇文章主要介绍【Java Poi Excel使用】一、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);
}
/**
* @param inputStream 读取文件的输入流
* @return 包含文件数据的工作簿对象
*/
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. 方法

/**
*
用poi自带的工具类来处理合并后的边框
*/
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);
}
/**
* 单元格样式
* @param workbook workbook
* @param font 字体
* @param isAutoLine 是否自动换行
* @param isBold 是否加粗
* @param fontSize 字体大小
* @param verticalAlignment 垂直样式
* @param horizontalAlignment 水平样式
* @param borderBottom 下边框
* @param borderTop 上边框
* @param borderLeft 左边框
* @param borderRight 右边框
* @return CellStyle
*/
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()&&region.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);
}
}
}
}

最后

以上就是贤惠钢铁侠为你收集整理的【Java Poi Excel使用】一、Excel操作的全部内容,希望文章能够帮你解决【Java Poi Excel使用】一、Excel操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部