一、简介
二、快速入门
1、添加依赖
本着用新不用旧的原则,我们这里使用最新的5.X版本
<!--03 年的 .xls--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.2</version> </dependency> <!--07 年的 .xlsx--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.2</version> </dependency>
2、快速入门
2.1 创建Workbook和Sheet
HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook) HSSFSheet sheet = workbook.createSheet();//创建工作表(Sheet) sheet = workbook.createSheet("Test");//创建工作表(Sheet)
2、创建单元格
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row = sheet.createRow(0);// 创建行,从0开始 HSSFCell cell = row.createCell(0);// 创建行的单元格,也是从0开始 cell.setCellValue("李志伟");// 设置单元格内容 row.createCell(1).setCellValue(false);// 设置单元格内容,重载 row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载 row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载
3、合并单元格
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row=sheet.createRow(0); //合并列 HSSFCell cell=row.createCell(0); cell.setCellValue("合并列"); CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5); sheet.addMergedRegion(region); //合并行 cell=row.createCell(6); cell.setCellValue("合并行"); region=new CellRangeAddress(0, 5, 6, 6); sheet.addMergedRegion(region);
4、单元格对齐相关参数
poi 是 5.2.2版本
/* 水平对齐相关参数: 如果是左侧对齐就是 HSSFCellStyle.ALIGN_FILL; 如果是居中对齐就是 HSSFCellStyle.ALIGN_CENTER; 如果是右侧对齐就是 HSSFCellStyle.ALIGN_RIGHT; 如果是跨列举中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION; 如果是两端对齐就是 HSSFCellStyle.ALIGN_JUSTIFY; 如果是填充就是 HSSFCellStyle.ALIGN_FILL; 垂直对齐相关参数: 如果是靠上就是 HSSFCellStyle.VERTICAL_TOP; 如果是居中就是 HSSFCellStyle.VERTICAL_CENTER; 如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM; 如果是两端对齐就是 HSSFCellStyle.VERTICAL_JUSTIFY;*/ HSSFCellStyle style=workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style.setWrapText(true);//自动换行 style.setIndention((short)5);//缩进 style.setRotation((short)60);//文本旋转,这里的取值是从-90到90,而不是0-180度。 HSSFCell cell=row.createCell(0); cell.setCellValue("单元格对齐"); cell.setCellStyle(style);
5、设置对齐格式和自动换行
poi 是 4.1.2版本
//设置对齐格式 CellStyle cellStyle = workBook.createCellStyle(); //水平居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); //垂直居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置自动换行 cellStyle.setWrapText(true);
6、设置字体格式
/* 下划线选项值: 单下划线 FontFormatting.U_SINGLE 双下划线 FontFormatting.U_DOUBLE 会计用单下划线 FontFormatting.U_SINGLE_ACCOUNTING 会计用双下划线 FontFormatting.U_DOUBLE_ACCOUNTING 无下划线 FontFormatting.U_NONE 上标下标选项值: 上标 FontFormatting.SS_SUPER 下标 FontFormatting.SS_SUB 普通,默认值 FontFormatting.SS_NONE*/ HSSFCell cell = row.createCell(1); cell.setCellValue("设置字体"); HSSFCellStyle style = workbook.createCellStyle(); HSSFFont font = workbook.createFont(); font.setFontName("华文行楷");//设置字体名称 font.setFontHeightInPoints((short)28);//设置字号 font.setColor(HSSFColor.RED.index);//设置字体颜色 font.setUnderline(FontFormatting.U_SINGLE);//设置下划线 font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标 font.setStrikeout(true);//设置删除线 style.setFont(font); cell.setCellStyle(style);
三、poi的基本操作
1、poi设置自适应列宽
//poi设置自适应列宽 private void setColumnWidth(HSSFSheet sheet) { //sheet的索引从0开始,获取sheet列数 int maxColumn = sheet.getRow(0).getPhysicalNumberOfCells(); /**第一种,实现自动换行,但不适用于中文 for (int i = 0; i < maxColumn; i++) { sheet.autoSizeColumn(i); } */ //第二种 for (int columnNum = 0; columnNum <= maxColumn; columnNum++) { int columnWidth = sheet.getColumnWidth(columnNum) / 256; // 遍历列的数据,获取这一列的最长字符串 for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) { HSSFRow currentRow; if (sheet.getRow(rowNum) == null) { currentRow = sheet.createRow(rowNum); } else { currentRow = sheet.getRow(rowNum); } if (currentRow.getCell(columnNum) != null) { HSSFCell currentCell = currentRow.getCell(columnNum); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { //int length = currentCell.getStringCellValue().getBytes().length; //上面是网上所有currentCell获取length答案,但试过后发现偏大,在一个文章下的评论区看到下面的计算,试了一下,列宽实现了自适应大小,还没搞懂原因 //length = (byte长度+string长度)/2,有了解的麻烦,麻烦留言解释一下,感谢!! int length = (currentCell.getStringCellValue().getBytes(StandardCharsets.UTF_8).length + currentCell.toString().length()) / 2; if (columnWidth < length) { columnWidth = length; } } } } //将最长的length*256设为列宽 // sheet.setColumnWidth((short)列数,(short)(length*256)); sheet.setColumnWidth(columnNum, columnWidth * 256); } }