POI如何往单元格中写公式并计算demo

2022-12-07 14:34:17 浏览数 (2)

需求

导出excel的时候需要导出某些通过公式计算的单元格

场景一

将公式写入某个单元格并执行计算

代码语言:javascript复制
    @Test
    public void formulaTest2() throws IOException {
	//本地创建formula.xlsx测试文件
        InputStream in = new FileInputStream("D:\formula.xlsx");
        Workbook book = new XSSFWorkbook(in);
        Sheet sheet = book.getSheet("formula");
	// 这里必须要设置为true
        sheet.setForceFormulaRecalculation(true);
        Cell cell = sheet.getRow(6).getCell(2);
        // 可跨sheet页,"基础参数"为另外一个sheet也的名字
        cell.setCellFormula("基础参数!B3"); 

//        XSSFFormulaEvaluator formulaEvaluator= (XSSFFormulaEvaluator) book.getCreationHelper().createFormulaEvaluator();
//        formulaEvaluator.evaluateFormulaCell(cell);
        OutputStream stream = new FileOutputStream("D:\formula.xlsx");
        book.write(stream);
        in.close();

    }

注意 : cell.setCellFormula("A3 A6")时公式的值中不能加等号,否则会报错

场景二

只把公式写到对应的某个各自不执行计算,自己往里面填充值

代码语言:javascript复制
    @Test
    public void formulaTest2() throws IOException {
        InputStream in = new FileInputStream("D:\formula.xlsx");
        Workbook book = new XSSFWorkbook(in);
        Sheet sheet = book.getSheet("formula");
        // 执行强制计算
        Cell cell = sheet.getRow(6).getCell(2);
	// 设置公式
        cell.setCellFormula("A3 A6");
        // 填充自己预设的值
        cell.setCellValue(11);
//        XSSFFormulaEvaluator formulaEvaluator= (XSSFFormulaEvaluator) book.getCreationHelper().createFormulaEvaluator();
//        formulaEvaluator.evaluateFormulaCell(cell);
        OutputStream stream = new FileOutputStream("D:\formula.xlsx");
        book.write(stream);
        in.close();


    }

二 往excel中插入图片

代码语言:javascript复制
public class TestCellStyle {
    public static void main(String[] args) throws Exception {
        //创建工作簿,excel2007版本的,如果是excel2003的话。创建的对象是:HSSFWorkbook
        Workbook workbook = new SXSSFWorkbook();
        //创建sheet
        Sheet sheet = workbook.createSheet("picture sheet");
 
        //创建文件输入流
        FileInputStream inputStream = new FileInputStream("D:\2345Downloads\datupian.png");
        //利用POI提供的工具类把文件流转化成二进制数据
        byte[] bytes = IOUtils.toByteArray(inputStream);
 
        //向POI内存中添加一张图片,返回图片在图片集合中的索引
        int pictureIndex = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);//参数一:图片的二进制数据,参数二:图片类型
 
        //从Workbook中得到绘制图片的工具类
        CreationHelper helper = workbook.getCreationHelper();
        //创建锚点,设置图片坐标
        ClientAnchor clientAnchor = helper.createClientAnchor();
        clientAnchor.setRow1(2);//设置起始行
        clientAnchor.setCol1(3);//设置起始列
 
        //从sheet对象中得到一个绘图对象
        Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
 
        //绘制图片,锚点,图片在内存中的位置
        Picture picture = drawingPatriarch.createPicture(clientAnchor, pictureIndex);
 
        // 使用固定的长宽比例系数
        double a = 10;//表示的是10列
        double b = 15;//表示的是15行
        picture.resize(a,b);//自适应渲染图片
 
        //创建文件输出流
        FileOutputStream out = new FileOutputStream("D:\2345Downloads\picture2.xlsx");
        //调用工作簿的write创建excel
        workbook.write(out);
        out.close();
    }
}

转载自文章:https://blog.csdn.net/zengdongwen/article/details/103490661

0 人点赞