Java应用-2-POI之操作Excel
1. 前言
Apache POI是Apache开源的用以Java操作Microsoft Office套件档案进行读写的API库。
- 版本
- HSSF:支持Excel 97~2003版本的.xls文档操作,不过局限性较大,单个sheet最多65536行256列。
- XSSF:支持Excel 2007版本往后.xlsx文档,单个sheet最多1048576行16384列。但是可能会消耗大量内存导致溢出风险。
- SXSSF:在XSSF基础上的低内存消耗方式,从POI 3.8版本开始支持。原理是限制内存占用的大小,且将内存中超过100条生成的数据缓存在磁盘上。用于超大写入量的文件,但是需要清理生成的缓存文件。
- 选择
Excel是向下兼容的,也就是高版本兼容低版本的文档。但是还不支持.xlsx文档的Excel版本也不多了,所以比较推荐使用XSSF,本篇也是基于XSSF操作的。因为XSSF所有操作文档的数据都是缓存在内存中的,如果要同时处理大量的Excel文档,还是要注意内存的使用量。 - 依赖(可以的话尽量使用maven,手动导入太痛苦了)
- poi-3.17.jar
- poi-ooxml-3.17.jar
- poi-ooxml-schemas-3.17.jar
- xmlbeans-2.3.0.jar
- commons-collections4-4.1.jar
- 更多方法请见:
Apache POI使用详解 (HSSF)
HSSFCellStyle 设置 Excel单元格样式 - 注意:
HSSF和XSSF很多对象和参数都不一致,相同功能但是不同方法名和参数值,具体需要查询后使用。
2. 创建&编辑文档
- 创建文档
// 创建Excel文档对象 XSSFWorkbook workbook = new XSSFWorkbook();
- 字体样式
// 字体样式是全局的,基于XSSFWorkbook对象 XSSFFont font = workbook.createFont(); // 是否加粗 font.setBold(true); // 字体 font.setFontName("宋体"); // 字号 font.setFontHeightInPoints((short) 10);
- 单元格样式
// 单元格样式也是全局的 XSSFCellStyle cellStyle = workbook.createCellStyle(); // 设置单元格内文字字体样式 cellStyle.setFont(font); // 设置上下左右边框加粗 cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); // 设置单元格背景颜色,设置颜色有“两”种方式,且需要设定一下FillPattern才可生效 cellStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255))); cellStyle.setFillForegroundColor(new XSSFColor(Color.decode("#FFFFFF"))); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 内容居中 cellStyle.setAlignment(HorizontalAlignment.CENTER);
- 创建Sheet页
XSSFSheet sheet = workbook.createSheet(); // 设置Sheet页名称,Sheet页下标从0开始 workbook.setSheetName(0, "SheetName"); // 设置列宽度,列从下标0开始,第二个参数是每加1就是一个英文字符的1/256,所以用60字符*256,就可以展示60字符宽度 sheet.setColumnWidth(0, 60 * 256); // 冻结第一行,前两个参数是冻结的第几列第几行,后两个参数是窗口可见象限 sheet.createFreezePane(0, 1, 0, 1); // 冻结第一列 sheet.createFreezePane(1, 0, 1, 0); // 合并单元格,CellRangeAddress(开始行下标, 结束行下标, 开始列下标, 结束列下标) // 注意:这里合并单元格以后会出现合并单元格样式丢失,此时创建出所有合并的单元格原格并添加上样式即可正常 sheet.addMergedRegion(new CellRangeAddress(0, 10, 0, 10));
- 创建Sheet的行
// Sheet行下标从0开始 XSSFRow row = sheet.createRow(0);
- 创建Row的列
// Row列下标从0开始 XSSFCell cell = row.createCell(0); // 设置值 cell.setCellValue("xxyy"); // 设置样式 cell.setCellStyle(cellStyle); // 设置文档内Sheet页+单元格超链接,语法是:HYPERLINK("#<Sheet页名称>!<单元格列行标识>") cell.setCellFormula("HYPERLINK(\"#SheetName!A1\")");
- 写入到文件
File file = new File("C:\\test.xlsx"); try { FileOutputStream fos = new FileOutputStream(file); workbook.write(fos); fos.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); }
3. 读取文档
File file = new File("C:\\test.xlsx");
InputStream in = new FileInputStream(file);
// 读取Excel
XSSFWorkbook wb = new XSSFWorkbook(in);
// 获取第一个sheet,下标还是从0开始
XSSFSheet sheet = wb.getSheetAt(0);
// 获取第一行
XSSFRow row = sheet.getRow(0);
// 获取第一列
XSSFCell cell = row.getCell(0);
// 获取单元格内容
String value = cell.getStringCellValue();