Apache POI 使用Java处理Excel数据 进阶
1.POI入门教程链接
http://t.csdnimg.cn/Axn4Phttp://t.csdnimg.cn/Axn4P建议:从入门看起会更好理解POI对Excel数据的使用和处理
记得引入依赖:
org.apache.poi poi 4.0.1 org.apache.poi poi-ooxml 4.0.1 org.apache.poi poi-ooxml-schemas 4.0.1
2.POI对单元格样式处理
// JUnit的@Test注解表示这是一个测试方法 @Test void testExcel() throws IOException { // 创建一个新的XSSFWorkbook对象,这是操作Excel文件的核心类 XSSFWorkbook workbook = new XSSFWorkbook(); // 在工作簿中创建一个名为"sheet1"的工作表 XSSFSheet sheet = workbook.createSheet("sheet1"); // 在工作表中创建第三行(行索引从0开始) Row row = sheet.createRow(2); // 在该行中创建第三个单元格(列索引从0开始) Cell cell = row.createCell(2); // 设置单元格的值为"Hello World 2024" cell.setCellValue("Hello World 2024"); // 创建一个单元格样式 CellStyle cellStyle = workbook.createCellStyle(); // 设置单元格的上下左右边框为细线 cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); // 创建一个字体对象 Font font = workbook.createFont(); // 设置字体为"宋体" font.setFontName("宋体"); // 设置字体大小为32磅 font.setFontHeightInPoints((short) 32); // 将字体应用到单元格样式中 cellStyle.setFont(font); // 设置行高为50磅 row.setHeightInPoints((short) 50); // 设置第三列的宽度为100 * 365(单位是1/256个字符宽度) sheet.setColumnWidth(2, 100 * 365); // 将单元格样式应用到单元格上 cell.setCellStyle(cellStyle); // 创建一个文件输出流,用于将Excel文件写入磁盘 FileOutputStream out = new FileOutputStream("D:\\Desktop\\JavaCode\\poi-demo\\src\\main\\resources\\test.xlsx"); // 将工作簿写入输出流 workbook.write(out); // 关闭输出流 out.close(); }
3.将图片写入Excel表格中
// JUnit的@Test注解表示这是一个测试方法 @Test void testDrawExcel() throws IOException { // 创建一个新的XSSFWorkbook对象,这是操作Excel文件的核心类 XSSFWorkbook workbook = new XSSFWorkbook(); // 在工作簿中创建一个名为"sheet1"的工作表 XSSFSheet sheet = workbook.createSheet("sheet1"); // 创建一个文件输入流,用于读取图片文件 FileInputStream in = new FileInputStream("D:\\Desktop\\test.jpg"); // 创建一个字节数组,长度为图片文件的大小 byte[] bytes = new byte[in.available()]; // 读取图片文件到字节数组 in.read(bytes); // 关闭输入流 in.close(); // 将图片添加到工作簿,并返回图片的索引 int index = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); // 获取创建助手,用于创建绘图对象 CreationHelper helper = workbook.getCreationHelper(); // 创建绘图对象,用于在工作表中绘制图片 XSSFDrawing drawing = sheet.createDrawingPatriarch(); // 创建客户端锚点,用于指定图片的位置 ClientAnchor anchor = helper.createClientAnchor(); // 设置图片的起始行 anchor.setRow1(0); // 设置图片的起始列 anchor.setCol1(1); // 创建图片对象,并将其插入到工作表中 XSSFPicture picture = drawing.createPicture(anchor, index); // 调整图片大小以适应单元格 picture.resize(); // 创建一个文件输出流,用于将Excel文件写入磁盘 FileOutputStream out = new FileOutputStream("D:\\Desktop\\JavaCode\\poi-demo\\src\\main\\resources\\test.xlsx"); // 将工作簿写入输出流 workbook.write(out); // 关闭输出流 out.close(); }
4.使用模版Excel
如何想根据模版进行创建Excel表格。而不是直接覆盖创建新的Excel表格的方式:
// JUnit的@Test注解表示这是一个测试方法 @Test void testDrawExcel() throws IOException { // 使用Spring的ClassPathResource来加载类路径下的资源文件 Resource resource = new ClassPathResource("test.xlsx"); // 获取资源文件的FileInputStream FileInputStream resourceIn = new FileInputStream(resource.getFile()); // 使用FileInputStream加载现有工作簿 XSSFWorkbook workbook = new XSSFWorkbook(resourceIn); // 获取工作簿中的第一个工作表 XSSFSheet sheet = workbook.getSheetAt(0); // 创建一个文件输入流,用于读取图片文件 FileInputStream in = new FileInputStream("D:\\Desktop\\test.jpg"); // 创建一个字节数组,长度为图片文件的大小 byte[] bytes = new byte[in.available()]; // 读取图片文件到字节数组 in.read(bytes); // 关闭输入流 in.close(); // 将图片添加到工作簿,并返回图片的索引 int index = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); // 获取创建助手,用于创建绘图对象 CreationHelper helper = workbook.getCreationHelper(); // 获取工作表中的绘图对象,如果没有则创建 Drawing drawing = sheet.createDrawingPatriarch(); // 创建客户端锚点,用于指定图片的位置 ClientAnchor anchor = helper.createClientAnchor(); // 设置图片的起始行为第11行(行索引从0开始) anchor.setRow1(10); // 设置图片的起始列为第2列(列索引从0开始) anchor.setCol1(1); // 创建图片对象,并将其插入到工作表中 Picture picture = drawing.createPicture(anchor, index); // 调整图片大小以适应单元格 picture.resize(); // 创建一个文件输出流,用于将Excel文件写入磁盘 FileOutputStream out = new FileOutputStream("D:\\Desktop\\JavaCode\\poi-demo\\src\\main\\resources\\test.xlsx"); // 将工作簿写入输出流 workbook.write(out); // 关闭输出流 out.close(); }
5.自定义Excel工具类
(1)自定义注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ExcelAttribute { /** 对应的列名称 */ String name() default ""; /** 列序号 */ int sort(); /** 字段类型对应的格式 */ String format() default ""; }
(2) 导出工具类:
public class ExcelExportUtil { private int rowIndex; private int styleIndex; private String templatePath; private Class clazz; private Field fields[]; public ExcelExportUtil(Class clazz,int rowIndex,int styleIndex) { this.clazz = clazz; this.rowIndex = rowIndex; this.styleIndex = styleIndex; fields = clazz.getDeclaredFields(); } /** * 基于注解导出 */ public void export(HttpServletResponse response,InputStream is, List objs,String fileName) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(is); Sheet sheet = workbook.getSheetAt(0); CellStyle[] styles = getTemplateStyles(sheet.getRow(styleIndex)); AtomicInteger datasAi = new AtomicInteger(rowIndex); for (T t : objs) { Row row = sheet.createRow(datasAi.getAndIncrement()); for(int i=0;i
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。