基於最新的Apache POI 4.0.1
版本來總結一下寫入Excel的過程。
代碼前准備:
添加4.0.1 poi maven依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.springbootemaildemo</groupId> <artifactId>springboot-email-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-email-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.41</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency> <!--poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
DataVo(數據封裝類)
package com.springbootemaildemo.excel.b; /** * 讀取Excel時,封裝讀取的每一行的數據 */ public class DataVo { /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
ExcelWriter(寫入excel文件主要代碼類)
package com.springbootemaildemo.excel.b; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ExcelWriter { private static List<String> CELL_HEADS; //列頭 static { // 類裝載時就載入指定好的列頭信息,如有需要,可以考慮做成動態生成的列頭 CELL_HEADS = new ArrayList<>(); CELL_HEADS.add("姓名"); CELL_HEADS.add("年齡"); } /** * 生成Excel並寫入數據信息 * * @param dataList 數據列表 * @return 寫入數據后的工作簿對象 */ public static Workbook exportData(List<DataVo> dataList) { // 生成xlsx的Excel Workbook workbook = new SXSSFWorkbook(); // 如需生成xls的Excel,請使用下面的工作簿對象,注意后續輸出時文件后綴名也需更改為xls //Workbook workbook = new HSSFWorkbook(); // 生成Sheet表,寫入第一行的列頭 Sheet sheet = buildDataSheet(workbook); //構建每行的數據內容 int rowNum = 1; for (Iterator<DataVo> it = dataList.iterator(); it.hasNext(); ) { DataVo data = it.next(); if (data == null) { continue; } //輸出行數據 Row row = sheet.createRow(rowNum++); convertDataToRow(data, row); } return workbook; } /** * 生成sheet表,並寫入第一行數據(列頭) * * @param workbook 工作簿對象 * @return 已經寫入列頭的Sheet */ private static Sheet buildDataSheet(Workbook workbook) { Sheet sheet = workbook.createSheet(); // 設置列頭寬度 for (int i = 0; i < CELL_HEADS.size(); i++) { sheet.setColumnWidth(i, 4000); } // 設置默認行高 sheet.setDefaultRowHeight((short) 400); // 構建頭單元格樣式 CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook()); // 寫入第一行各列的數據 Row head = sheet.createRow(0); for (int i = 0; i < CELL_HEADS.size(); i++) { Cell cell = head.createCell(i); cell.setCellValue(CELL_HEADS.get(i)); cell.setCellStyle(cellStyle); } return sheet; } /** * 設置第一行列頭的樣式 * * @param workbook 工作簿對象 * @return 單元格樣式對象 */ private static CellStyle buildHeadCellStyle(Workbook workbook) { CellStyle style = workbook.createCellStyle(); //對齊方式設置 style.setAlignment(HorizontalAlignment.CENTER); //邊框顏色和寬度設置 style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框 style.setBorderLeft(BorderStyle.THIN); style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框 style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框 style.setBorderTop(BorderStyle.THIN); style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框 //設置背景顏色 style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); //粗體字設置 Font font = workbook.createFont(); font.setBold(true); style.setFont(font); return style; } /** * 將數據轉換成行 * * @param data 源數據 * @param row 行對象 * @return */ private static void convertDataToRow(DataVo data, Row row) { int cellNum = 0; Cell cell; // 姓名 cell = row.createCell(cellNum++); cell.setCellValue(null == data.getName() ? "" : data.getName()); // 年齡 cell = row.createCell(cellNum++); if (null != data.getAge()) { cell.setCellValue(data.getAge()); } else { cell.setCellValue(""); } } }
MyTest(測試類)
package com.springbootemaildemo.excel.b; import org.apache.poi.ss.usermodel.Workbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MyTest { private static final Logger logger = LoggerFactory.getLogger(MyTest.class); public static void main(String[] args) { // 創建需要寫入的數據列表 List<DataVo> dataVOList = new ArrayList<>(); DataVo dataVO = new DataVo(); dataVO.setName("小明"); dataVO.setAge(18); DataVo dataVO2 = new DataVo(); dataVO2.setName("小花"); dataVO2.setAge(19); dataVOList.add(dataVO); dataVOList.add(dataVO2); // 寫入數據到工作簿對象內 Workbook workbook = ExcelWriter.exportData(dataVOList); // 以文件的形式輸出工作簿對象 FileOutputStream fileOut = null; try { //E:\files\write-01.xlsx 不用創建,會自動生成的 String exportFilePath = "E:\\files\\write-01.xlsx"; File exportFile = new File(exportFilePath); if (!exportFile.exists()) { exportFile.createNewFile(); } fileOut = new FileOutputStream(exportFilePath); workbook.write(fileOut); fileOut.flush(); } catch ( Exception e) { logger.warn("輸出Excel時發生錯誤,錯誤原因:" + e.getMessage()); } finally { try { if (null != fileOut) { fileOut.close(); } if (null != workbook) { workbook.close(); } } catch (IOException e) { logger.warn("關閉輸出流時發生錯誤,錯誤原因:" + e.getMessage()); } } } }