1. EasyExcel 简介
EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 工具。在处理大数据量的 Excel 文件时,它具有占用内存少、性能高的特点,并且使用简单,通过注解和少量的代码就能完成 Excel 文件的读写操作。
2. EasyExcel 简单语法及使用
2.1 添加依赖
如果使用 Maven 项目,在pom.xml中添加以下依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>2.2 写 Excel 示例
定义 Excel 数据实体类:
importcom.alibaba.excel.annotation.ExcelProperty;publicclassDemoData{@ExcelProperty("订单编号")privateStringorderNo;@ExcelProperty("销售金额")privateDoublesalesAmount;// 构造函数、getter 和 setter 方法publicDemoData(StringorderNo,DoublesalesAmount){this.orderNo=orderNo;this.salesAmount=salesAmount;}publicStringgetOrderNo(){returnorderNo;}publicvoidsetOrderNo(StringorderNo){this.orderNo=orderNo;}publicDoublegetSalesAmount(){returnsalesAmount;}publicvoidsetSalesAmount(DoublesalesAmount){this.salesAmount=salesAmount;}}写入 Excel 文件:
importcom.alibaba.excel.EasyExcel;importjava.util.ArrayList;importjava.util.List;publicclassWriteExcelExample{publicstaticvoidmain(String[]args){StringfileName="sales_report.xlsx";List<DemoData>dataList=newArrayList<>();dataList.add(newDemoData("001",1000.0));dataList.add(newDemoData("002",2000.0));EasyExcel.write(fileName,DemoData.class).sheet("销售报表").doWrite(dataList);}}2.3 读 Excel 示例
定义监听器类:
importcom.alibaba.excel.context.AnalysisContext;importcom.alibaba.excel.event.AnalysisEventListener;importjava.util.ArrayList;importjava.util.List;publicclassDemoDataListenerextendsAnalysisEventListener<DemoData>{privateList<DemoData>dataList=newArrayList<>();@Overridepublicvoidinvoke(DemoDatadata,AnalysisContextcontext){dataList.add(data);}@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){// 数据解析完成后的操作System.out.println("数据解析完成,共 "+dataList.size()+" 条记录");}publicList<DemoData>getDataList(){returndataList;}}读取 Excel 文件:
importcom.alibaba.excel.EasyExcel;publicclassReadExcelExample{publicstaticvoidmain(String[]args){StringfileName="sales_report.xlsx";DemoDataListenerlistener=newDemoDataListener();EasyExcel.read(fileName,DemoData.class,listener).sheet().doRead();System.out.println(listener.getDataList());}}3. 从数据库中取数形成电商销售资金报表示例
3.1 数据库连接和数据查询
假设使用 MySQL 数据库,使用 JDBC 进行数据查询:
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.List;publicclassDatabaseUtils{privatestaticfinalStringURL="jdbc:mysql://localhost:3306/ecommerce";privatestaticfinalStringUSER="root";privatestaticfinalStringPASSWORD="password";publicstaticList<DemoData>querySalesData(){List<DemoData>dataList=newArrayList<>();try(Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery("SELECT order_no, sales_amount FROM sales_orders")){while(rs.next()){StringorderNo=rs.getString("order_no");doublesalesAmount=rs.getDouble("sales_amount");dataList.add(newDemoData(orderNo,salesAmount));}}catch(Exceptione){e.printStackTrace();}returndataList;}}3.2 生成电商销售资金报表,一个 sheet 带有多个报表
importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.write.metadata.WriteSheet;importjava.util.List;publicclassEcommerceSalesReportGenerator{publicstaticvoidmain(String[]args){StringfileName="ecommerce_sales_report.xlsx";// 从数据库中查询数据List<DemoData>salesData=DatabaseUtils.querySalesData();// 创建 Excel 写入对象varexcelWriter=EasyExcel.write(fileName).build();// 创建 sheetWriteSheetwriteSheet=EasyExcel.writerSheet("销售资金报表").build();// 第一个报表:销售订单报表excelWriter.write(salesData,writeSheet);// 模拟第二个报表数据(这里简单重复使用 salesData,实际可根据需求查询不同数据)excelWriter.write(salesData,writeSheet);// 关闭写入器excelWriter.finish();}}4. 报表格式设置
如果需要设置报表格式,如表头样式、数据样式等,可以使用 EasyExcel 提供的样式设置功能。以下是一个简单的表头样式设置示例:
importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.write.metadata.WriteSheet;importcom.alibaba.excel.write.metadata.style.WriteCellStyle;importcom.alibaba.excel.write.metadata.style.WriteFont;importcom.alibaba.excel.write.style.HorizontalCellStyleStrategy;importorg.apache.poi.ss.usermodel.HorizontalAlignment;importjava.util.List;publicclassFormattedReportGenerator{publicstaticvoidmain(String[]args){StringfileName="formatted_report.xlsx";List<DemoData>salesData=DatabaseUtils.querySalesData();// 表头样式WriteCellStyleheadWriteCellStyle=newWriteCellStyle();WriteFontheadWriteFont=newWriteFont();headWriteFont.setFontHeightInPoints((short)12);headWriteCellStyle.setWriteFont(headWriteFont);headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 内容样式WriteCellStylecontentWriteCellStyle=newWriteCellStyle();contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 样式策略HorizontalCellStyleStrategyhorizontalCellStyleStrategy=newHorizontalCellStyleStrategy(headWriteCellStyle,contentWriteCellStyle);// 创建 Excel 写入对象并应用样式策略varexcelWriter=EasyExcel.write(fileName,DemoData.class).registerWriteHandler(horizontalCellStyleStrategy).build();WriteSheetwriteSheet=EasyExcel.writerSheet("销售资金报表").build();excelWriter.write(salesData,writeSheet);excelWriter.finish();}}5、代码实现可视化调整样式
1. 基本样式设置
在 EasyExcel 里,能够运用WriteCellStyle和WriteFont类来设置单元格的样式,像字体、颜色、对齐方式等。以下是一个完整示例,展示如何设置表头和内容的样式:
importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.write.metadata.WriteSheet;importcom.alibaba.excel.write.metadata.style.WriteCellStyle;importcom.alibaba.excel.write.metadata.style.WriteFont;importcom.alibaba.excel.write.style.HorizontalCellStyleStrategy;importorg.apache.poi.ss.usermodel.*;importjava.util.ArrayList;importjava.util.List;// 定义 Excel 数据实体类classDemoData{@com.alibaba.excel.annotation.ExcelProperty("订单编号")privateStringorderNo;@com.alibaba.excel.annotation.ExcelProperty("销售金额")privateDoublesalesAmount;publicDemoData(StringorderNo,DoublesalesAmount){this.orderNo=orderNo;this.salesAmount=salesAmount;}publicStringgetOrderNo(){returnorderNo;}publicvoidsetOrderNo(StringorderNo){this.orderNo=orderNo;}publicDoublegetSalesAmount(){returnsalesAmount;}publicvoidsetSalesAmount(DoublesalesAmount){this.salesAmount=salesAmount;}}publicclassExcelStyleExample{publicstaticvoidmain(String[]args){StringfileName="styled_report.xlsx";List<DemoData>dataList=newArrayList<>();dataList.add(newDemoData("001",1000.0));dataList.add(newDemoData("002",2000.0));// 表头样式WriteCellStyleheadWriteCellStyle=newWriteCellStyle();WriteFontheadWriteFont=newWriteFont();headWriteFont.setFontHeightInPoints((short)14);// 设置表头字体大小headWriteFont.setBold(true);// 表头字体加粗headWriteCellStyle.setWriteFont(headWriteFont);headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());// 设置表头背景颜色headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 表头内容居中对齐// 内容样式WriteCellStylecontentWriteCellStyle=newWriteCellStyle();WriteFontcontentWriteFont=newWriteFont();contentWriteFont.setFontHeightInPoints((short)12);// 设置内容字体大小contentWriteCellStyle.setWriteFont(contentWriteFont);contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 内容居中对齐contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 内容垂直居中对齐contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);// 设置底部边框contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);// 设置左边框contentWriteCellStyle.setBorderRight(BorderStyle.THIN);// 设置右边框contentWriteCellStyle.setBorderTop(BorderStyle.THIN);// 设置顶部边框// 样式策略HorizontalCellStyleStrategyhorizontalCellStyleStrategy=newHorizontalCellStyleStrategy(headWriteCellStyle,contentWriteCellStyle);// 写入 Excel 文件并应用样式策略EasyExcel.write(fileName,DemoData.class).registerWriteHandler(horizontalCellStyleStrategy).sheet("销售报表").doWrite(dataList);}}2. 自定义样式处理器
要是有更复杂的样式需求,还能自定义样式处理器。下面是一个自定义样式处理器的示例,它会依据数据内容来设置不同的样式:
importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.write.handler.CellWriteHandler;importcom.alibaba.excel.write.metadata.holder.WriteSheetHolder;importcom.alibaba.excel.write.metadata.holder.WriteTableHolder;importcom.alibaba.excel.write.metadata.style.WriteCellStyle;importcom.alibaba.excel.write.metadata.style.WriteFont;importorg.apache.poi.ss.usermodel.*;importjava.util.ArrayList;importjava.util.List;classCustomCellStyleHandlerimplementsCellWriteHandler{@OverridepublicvoidafterCellDispose(WriteSheetHolderwriteSheetHolder,WriteTableHolderwriteTableHolder,List<CellData>cellDataList,Cellcell,Headhead,IntegerrelativeRowIndex,BooleanisHead){if(!isHead){WriteCellStylestyle=newWriteCellStyle();WriteFontfont=newWriteFont();if(cell.getColumnIndex()==1){// 假设第二列是销售金额列doubleamount=Double.parseDouble(cell.getStringCellValue());if(amount>1500){font.setColor(IndexedColors.RED.getIndex());// 销售金额大于 1500 显示红色字体}}style.setWriteFont(font);CellStylecellStyle=writeSheetHolder.getSheet().getWorkbook().createCellStyle();cellStyle.cloneStyleFrom(style.build());cell.setCellStyle(cellStyle);}}}publicclassCustomStyleExample{publicstaticvoidmain(String[]args){StringfileName="custom_styled_report.xlsx";List<DemoData>dataList=newArrayList<>();dataList.add(newDemoData("001",1000.0));dataList.add(newDemoData("002",2000.0));EasyExcel.write(fileName,DemoData.class).registerWriteHandler(newCustomCellStyleHandler()).sheet("销售报表").doWrite(dataList);}}借助工具进行可视化调整
在生成 Excel 文件之后,你可以使用 Excel 软件(如 Microsoft Excel 或 WPS 表格)打开文件,然后通过软件的界面来可视化地调整样式,具体操作步骤如下:
- 打开文件:用 Excel 软件打开 EasyExcel 生成的文件。
- 选择单元格或区域:选中你想要调整样式的单元格或者单元格区域。
- 调整样式:利用 Excel 软件提供的功能来调整样式,例如:
- 字体设置:在“开始”菜单中选择字体、字号、颜色、加粗、倾斜等。
- 对齐方式:通过“对齐方式”组设置水平对齐和垂直对齐方式。
- 边框和底纹:使用“边框”和“填充颜色”按钮来设置单元格的边框和背景颜色。
- 数据格式:在“数字”组中选择合适的数据格式,如货币、百分比等。