Apache POI 使用Java处理Excel数据 进阶

2024-07-19 1123阅读

1.POI入门教程链接

http://t.csdnimg.cn/Axn4PApache POI 使用Java处理Excel数据 进阶http://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
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]