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

需求

导出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();

}</code></pre></div></div><blockquote><p> 注意 : cell.setCellFormula(&#34;A3+A6&#34;)时公式的值中不能加等号,否则会报错

场景二

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

代码语言: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();
}</code></pre></div></div><p>二 往excel中插入图片</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">public class TestCellStyle {
public static void main(String[] args) throws Exception {
    //创建工作簿,excel2007版本的,如果是excel2003的话。创建的对象是:HSSFWorkbook
    Workbook workbook = new SXSSFWorkbook();
    //创建sheet
    Sheet sheet = workbook.createSheet(&#34;picture sheet&#34;);

    //创建文件输入流
    FileInputStream inputStream = new FileInputStream(&#34;D:\\2345Downloads\\datupian.png&#34;);
    //利用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&lt;?&gt; 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(&#34;D:\\2345Downloads\\picture2.xlsx&#34;);
    //调用工作簿的write创建excel
    workbook.write(out);
    out.close();
}

}

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