Java 使用 Apache POI 将 JSON 数据写入 Excel 表格并插入图片

本文介绍了如何使用 Java 的 Apache POI 库将 JSON 数据写入 Excel 表格,并附带将图片地址转换为图片并插入单元格的代码示例。

第一段代码:

String[] displayKeys = {"编号", "上传日期", "图片",  "姓名"}; 
String[] dataKeys = {"id", "date", "images",  "username"};
xlsx.create(path, fileName, "xlsx");
String flag = xlsx.writeInXlsxBulk(tempData.toString(), null, displayKeys, dataKeys);

第二段代码:

public String writeInXlsxBulk(String jsonstr, String title, String[] displayKeys, String[] dataKeys) {
    if(file==null) {
        return "error";
    }
    
    int rowcount = 0;
    String result = "";
    try {
        SXSSFWorkbook wb = new SXSSFWorkbook(100);
        
        Sheet sheet = wb.createSheet();
        Row r = null;
        Cell c = null;
        
        CellStyle cs1 = wb.createCellStyle();
        Font font1 = wb.createFont();
        //DataFormat df = workbook.createDataFormat();
        font1.setFontHeightInPoints((short)12);
        cs1.setFont(font1);
        cs1.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
        //cs1.setFillPattern((short)0);
        wb.setSheetName(0, "sheet1");
        
        //write in title
        if(title != null) {
            r = sheet.createRow(rowcount);
            r.setHeight((short)(256*1.5));
            rowcount++;
            c = r.createCell(0);
            c.setCellStyle(cs1);
            c.setCellValue(title);
        }
        
        //write in keys
        r = sheet.createRow(rowcount);
        r.setHeight((short)(256*1.5));
        rowcount++;
        for(int i=0;i<displayKeys.length;i++) {
            sheet.setColumnWidth(i, 256*4*displayKeys[i].getBytes().length/2);
            c = r.createCell(i);
            c.setCellStyle(cs1);
            c.setCellValue(displayKeys[i]);
        }
        
        //write in data
        JSONObject json = new JSONObject(jsonstr);
        System.out.println(json);
        JSONArray data = json.getJSONArray("data");
        int length = data.length();
        
        
        for(int i=0; i<length;i++) {
            r=sheet.createRow(i+rowcount);
            r.setHeight((short)(256*1.5));
            
            int cellNum = 0;
            JSONObject temp = new JSONObject(data.optString(i));
            for(cellNum=0;cellNum<displayKeys.length;cellNum++) {
                String value = temp.optString(dataKeys[cellNum]);
                CellUtil.createCell(r, cellNum, value);
                
                // 如果当前数据为图片地址,则插入图片
                if (dataKeys[cellNum].equals("images")) {
                    // 获取图片字节数组
                    URL imageUrl = new URL(value); // 假设 value 是图片 URL 地址
                    InputStream imageStream = imageUrl.openStream();
                    byte[] byteArray = IOUtils.toByteArray(imageStream);
                    
                    // 插入图片
                    int pictureIndex = wb.addPicture(byteArray, HSSFWorkbook.PICTURE_TYPE_JPEG);
                    HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
                    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) cellNum, i+rowcount, (short) (cellNum+1), i+rowcount+1);
                    HSSFPicture picture = patriarch.createPicture(anchor, pictureIndex);
                    picture.resize();
                }
            }
        }
        FileOutputStream fsout = new FileOutputStream(file);	
        wb.write(fsout);
        fsout.flush();
        fsout.close();
        wb.dispose();
        wb.close();

        isNewFile = false;
        result = "success";
        filesize = String.valueOf(file.length());
    } 
    catch (Exception e) {
        e.printStackTrace();
        result = "error";
    }
    
    return result;
}

说明:

  1. 代码中使用了 Apache POI 的 HSSFClientAnchorHSSFPicture 类来创建图片对象并将其插入单元格。
  2. images 数据存储的图片地址需要替换为实际的图片 URL 地址。
  3. 代码中使用了 IOUtils.toByteArray 方法将图片流转换为字节数组,需要导入 org.apache.commons.io.IOUtils 类。
  4. 插入图片时需要指定图片类型,代码中使用的是 HSSFWorkbook.PICTURE_TYPE_JPEG,可以根据实际情况修改。
  5. 代码中使用了 picture.resize() 方法调整图片大小,可以根据需要修改参数。

完整代码示例:

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.SXSSFWorkbook;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;

public class WriteDataToExcelWithImages {
    public static void main(String[] args) throws Exception {
        // 假设 JSON 数据为
        String jsonData = "{"data":[{"id":"1","date":"2023-03-08","images":"https://www.example.com/image1.jpg","username":"张三"},{"id":"2","date":"2023-03-09","images":"https://www.example.com/image2.jpg","username":"李四"},{"id":"3","date":"2023-03-10","images":"https://www.example.com/image3.jpg","username":"王五"}]}";
        
        String[] displayKeys = {"编号", "上传日期", "图片",  "姓名"}; 
        String[] dataKeys = {"id", "date", "images",  "username"};
        
        // 创建 Excel 文件
        String fileName = "data.xlsx";
        String path = "path/to/your/excel/file";
        // 创建 Excel 对象
        ExcelWriter xlsx = new ExcelWriter();
        xlsx.create(path, fileName, "xlsx");
        // 写入数据
        xlsx.writeInXlsxBulk(jsonData, null, displayKeys, dataKeys);
    }
    
    public String writeInXlsxBulk(String jsonstr, String title, String[] displayKeys, String[] dataKeys) {
        // ... 代码同上 ...
    }
}

注意:

上述代码仅供参考,具体实现可能需要根据实际情况进行调整。

Java 使用 Apache POI 将 JSON 数据写入 Excel 表格并插入图片

原文地址: https://www.cveoy.top/t/topic/qC6A 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录