精华内容
下载资源
问答
  • POI公式(函数)自动刷新值

    千次阅读 2019-06-04 15:40:53
    项目中遇到需要用POI公式计算某列的和 想到个简便方法 比如要计算B列的和,在excel中是在单元格填充 : =SUM(B2:B30) 这个是意思就是B列第三行到第31行的求和 在POI里面也可以这样计算 /** * Excel列的编号 ...

    项目中遇到需要用POI公式计算某列的和

    想到个简便方法

    比如要计算B列的和,在excel中是在单元格填充 : 

    =SUM(B2:B30)

    这个是意思就是B列第三行到第31行的求和

    在POI里面也可以这样计算

      /**
         * Excel列的编号
         */
        private static final String[] COLUMN = {"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE"};
    
    
      /**
         * 计算最后行的合计
         *
         * @param wb          工作表对象
         * @param sheet1      工作簿
         * @param i           最后一行的序号
         * @param totalColumn 总共多少列需要计算合计
         */
        private void calcAllPoint(XSSFWorkbook wb, XSSFSheet sheet1, int i, int totalColumn) {
            XSSFRow row1 = sheet1.createRow(i);
            row1.createCell(0).setCellValue("合计");
            // 用公式计算每一列的合计
            for (int j = 1; j <= totalColumn; j++) {
                XSSFCell cell = row1.createCell(j);
                cell.setCellType(CellType.FORMULA);
                StringBuilder sum = new StringBuilder("SUM(");
                sum.append(COLUMN[j - 1]);
                sum.append(3);
                sum.append(":");
                sum.append(COLUMN[j - 1]);
                sum.append(i);
                sum.append(")");
                cell.setCellFormula(sum.toString());
            }
            // 自动计算公式的值
            // HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
            wb.setForceFormulaRecalculation(true);
        }

    // HSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 这行代码在windows环境不会有问题,但是在linux服务器上就会报错:

    网上关于这两个错误的解释和解决办法几乎没有,只能自己解决,看了后台日志就是刷新公式值的那一行有问题,

    亲测,需要用 wb.setForceFormulaRecalculation(true);才可以

    看方法名就知道,像是暴力计算公式值,而且这个公式值会随着单元格内容变化而变化,很方便,

    切记,如果服务器是linux环境,一定使用

    wb.setForceFormulaRecalculation(true);

    展开全文
  • poi公式处理

    千次阅读 2017-10-16 20:38:49
    POI HSSF提供了一个HSSFCellUtil类(在org.apache.poi.hssf.usermodel.contrib包),里面有几个方法可以绕过HSSFCellStyle直接设定单元格的样式,但这几个方法会抛出NestableException异常,要处理这个异常,需要...
    1. 设置单元格样式 

      HSSFCellStyle类代表一种单元格样式。可以通过这个类来设置单元格的边框样式背景颜色字体水平垂直对齐方式等等。

       

      HSSFCellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE);
        titleStyle.setBorderLeft((short)1);
        titleStyle.setBorderRight((short)1);
        titleStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);
        titleStyle.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
        titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

       

      注意:如果我们定义了一种样式,把它赋给一些单元格。然后基于新的需要,更改该样式中的某个属性,再赋给另一些单元格。那么之前单元格样式的该属性也会被同时更改。

      比如我们定义了样式,设置单元格背景色为红色:

       

      HSSFCellStyle cellStyle = workbook.createCellStyle();

      cellStyle.setFillForegroundColor(HSSFColor.RED.index);
      cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

       

      然后把它赋给一个单元格:

       

      HSSFCell cell1 = row.createCell((short)1);

      cell1.setCellStyle(cellStyle);

       

      然后更改样式中的背景色属性为蓝色:

       

      cellStyle.setFillForegroundColor(HSSFColor.BLUE.index);

       

      然后赋给另一个单元格:

       

      HSSFCell cell2 = row.createCell((short)2);

      cell2.setCellStyle(cellStyle);

       

      想当然,我们预计在最终结果中cell1的背景色为红色,cell2的背景色为蓝色。但是结果是:两个单元格的背景色都变成了蓝色。

       

      遇到这种情况,要预先定义两种不同的单元格样式。

       

      当一个EXCEL文件同时需要很多大同小异的单元格样式时,这样一一定义很麻烦。POI HSSF提供了一个HSSFCellUtil类(在org.apache.poi.hssf.usermodel.contrib包),里面有几个方法可以绕过HSSFCellStyle直接设定单元格的样式,但这几个方法会抛出NestableException异常,要处理这个异常,需要引用Apache的几个Common包:

      commons-beanutils.jar

      commons-beanutils-bean-collections.jar

      commons-beanutils-core.jar

      commons-lang.jar

      commons-logging-api.jar

       

      合并单元格

      HSSFSheet.addMergedRegion(new Region())方法可以合并单元格,Region()中的一个构造函数含有四个参数,分别代表起始行、起始列、结束行、结束列:

      sheet.addMergedRegion(new Region(startRow,startCell,endRow,endCell)));

       

      处理公式

       

      HSSFCell.setCellFormula()方法用来在EXCEL单元格中写入公式。

         cell = row.createCell((short)(dataFlag));
         cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
         cell.setCellFormula("SUM("A1:D1")");
         cell.setCellStyle(nameStyle);

       

      处理链接

       

      在POI中往单元格中写链接,是用HYPERLINK函数搞定的。

      HYPERLINK函数包含两个参数,第一个参数是指向的URL地址,第二个参数是显示字串。

       

         cell = row.createCell((short)(dataFlag));
         cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
         cell.setCellFormula("HYPERLINK('链接地址http...')");
         cell.setCellStyle(linkStyle);

       

      为了使链接效果更好,我们可以给链接所在单元格定义一种样式,使链接显示为有下划线的蓝色字串:

       

        HSSFCellStyle linkStyle = workbook.createCellStyle();
        linkStyle.setBorderBottom((short)1);
        linkStyle.setBorderLeft((short)1);
        linkStyle.setBorderRight((short)1);
        linkStyle.setBorderTop((short)1);
        linkStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
        linkStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setUnderline((byte)1);
        font.setColor(HSSFColor.BLUE.index);
        linkStyle.setFont(font);

       

      中文处理:

       

      要在通过POI生成的EXCEL中正常显示中文,需要为单元格设置编码:

       

      cell.setEncoding(HSSFCell.ENCODING_UTF_16);
        cell.setCellValue("部门");

    Java使用HSSF读取Excel表中公式列的方法
    1. FileInputStream fis = new FileInputStream("c:/temp/test.xls");
      HSSFWorkbook wb = new HSSFWorkbook(fis);
      HSSFSheet sheet = wb.getSheetAt(0);
      HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);

      // suppose your formula is in B3
      CellReference cellReference = new CellReference("B3");
      HSSFRow row = sheet.getRow(cellReference.getRow());
      HSSFCell cell = row.getCell(cellReference.getCol());
      //设置单元格所在行
      evaluator.setCurrentRow(row);
      HSSFFormulaEvaluator.CellValue cellValue = evaluator.evaluate(cell);

      switch (cellValue.getCellType()) {
      case HSSFCell.CELL_TYPE_BOOLEAN:
          System.out.println(cellValue.getBooleanValue());
          break;
      case HSSFCell.CELL_TYPE_NUMERIC:
          System.out.println(cellValue.getNumberValue());
          break;
      case HSSFCell.CELL_TYPE_STRING:
          System.out.println(cellValue.getStringValue());
          break;
      case HSSFCell.CELL_TYPE_BLANK:
          break;
      case HSSFCell.CELL_TYPE_ERROR:
          break;

      // CELL_TYPE_FORMULA will never happen
      case HSSFCell.CELL_TYPE_FORMULA:
          break;
      }

    展开全文
  • POI 公式

    2016-11-25 18:15:42
    本章将介绍如何使用Java编程应用不同单元公式的过程。 Excel应用程序的基本目的是通过应用公式就可以保持数值数据。 在公式中,我们通过动态值,或在Excel工作表中的值的位置。在执行这个公式,就会得到想要的结果...

    本章将介绍如何使用Java编程应用不同单元公式的过程。 Excel应用程序的基本目的是通过应用公式就可以保持数值数据。

    在公式中,我们通过动态值,或在Excel工作表中的值的位置。在执行这个公式,就会得到想要的结果。下表列出了常用的在Excel中的几个基本公式。

    操作 语法
    添加多个数值 = SUM(Loc1:Locn) or = SUM(n1,n2,)
    计数 = COUNT(Loc1:Locn) or = COUNT(n1,n2,)
    两个数的幂 = POWER(Loc1,Loc2) or = POWER(number, power)
    多个数的最大值 = MAX(Loc1:Locn) or = MAX(n1,n2,)
    乘积 = PRODUCT(Loc1:Locn) or = PRODUCT(n1,n2,)
    阶乘 = FACT(Locn) or = FACT(number)
    绝对数字 = ABS(Locn) or = ABS(number)
    今天的日期 =TODAY()
    转换成小写 = LOWER(Locn) or = LOWER(text)
    平方根 = SQRT(locn) or = SQRT(number)

    以下代码用于公式添加至单元格,并执行它。

    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    public class Formula 
    {
       public static void main(String[] args)throws Exception 
       {
          XSSFWorkbook workbook = new XSSFWorkbook(); 
          XSSFSheet spreadsheet = workbook.createSheet("formula");
          XSSFRow row = spreadsheet.createRow(1);
          XSSFCell cell = row.createCell(1);
          cell.setCellValue("A =" );
          cell = row.createCell(2);
          cell.setCellValue(2);
          row = spreadsheet.createRow(2);
          cell = row.createCell(1);
          cell.setCellValue("B =");
          cell = row.createCell(2);
          cell.setCellValue(4);
          row = spreadsheet.createRow(3);
          cell = row.createCell(1);
          cell.setCellValue("Total =");
          cell = row.createCell(2);
          // Create SUM formula
          cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("SUM(C2:C3)" );
          cell = row.createCell(3);
          cell.setCellValue("SUM(C2:C3)");
          row = spreadsheet.createRow(4);
          cell = row.createCell(1);
          cell.setCellValue("POWER =");
          cell=row.createCell(2);
          // Create POWER formula
          cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("POWER(C2,C3)");
          cell = row.createCell(3);
          cell.setCellValue("POWER(C2,C3)");
          row = spreadsheet.createRow(5);
          cell = row.createCell(1);
          cell.setCellValue("MAX =");
          cell = row.createCell(2);
          // Create MAX formula
          cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("MAX(C2,C3)");
          cell = row.createCell(3);
          cell.setCellValue("MAX(C2,C3)");
          row = spreadsheet.createRow(6);
          cell = row.createCell(1);
          cell.setCellValue("FACT =");
          cell = row.createCell(2);
          // Create FACT formula
          cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("FACT(C3)");
          cell = row.createCell(3);
          cell.setCellValue("FACT(C3)");
          row = spreadsheet.createRow(7);
          cell = row.createCell(1);
          cell.setCellValue("SQRT =");
          cell = row.createCell(2);
          // Create SQRT formula
          cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
          cell.setCellFormula("SQRT(C5)");
          cell = row.createCell(3);
          cell.setCellValue("SQRT(C5)");
          workbook.getCreationHelper()
          .createFormulaEvaluator()
          .evaluateAll();
          FileOutputStream out = new FileOutputStream(
          new File("formula.xlsx"));
          workbook.write(out);
          out.close();
          System.out.println("fromula.xlsx written successfully");
       }
    }
    

    保存上面的代码到文件Formula.java,然后编译并从命令提示符如下执行它。

    $javac Formula.java
    $java Formula
    

    它会生成一个名为formula.xlsx在当前目录中的Excel文件并显示在命令提示符处键入以下输出。

    fromula.xlsx written successfully
    

    formula.xlsx文件如下所示。

    Formula
     
    展开全文
  • 本文出自微信公众号【碧海风云】之《三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云》公式符号概述英国原伦敦南岸大学数学教授大卫·辛马斯特(David Breyer Singmaster),在研究魔方问题的同时,于1978年12月发明...

    6dc668f5ee7746319d59e203d685ff37.png

    本文出自微信公众号【碧海风云】之《三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云》

    公式符号概述

    英国原伦敦南岸大学数学教授大卫·辛马斯特(David Breyer Singmaster),在研究魔方问题的同时,于1978年12月发明了魔方转动的记录方法,称之为“辛马斯特标记”(Singmaster notation),此后便成为了通用标准,也就是我们所说的“公式符号”。

    辛马斯特标记,由“各层代号”、“旋转方向”两部分组成:

    1. 各层代号:魔方各层以英文首字母指代。R(Right)、L(Left)、U(Up)、D(Down)、F(Front)、B(Back)分别指代右、左、顶(上)、底(下)、正(前)、背(后)层。
    2. 旋转方向:顺时针旋转90°,直接写各层代号;逆时针旋转90°,在各层代号后缀【'】;旋转180°,在各层代号后缀【2】(默认顺时针方向旋转180°)。

    完整的辛马斯特标记可以理解为【以面向指代层的视角,按方向进行旋转】。

    • 例如:R,以面向右面视角,将右面顺时针旋转90°。从正面视角来看,即右面“向上”转90°。
    • 又例如:D,以面向底面视角,将底面顺时针旋转90°。从正面视角来看,即右面“向右”转90°。
    • 又例如:B',以面向背面视角,将背面逆时针旋转90°。从正面视角来看,即背面“向右”转90°。

    除此之外,若要记录更加详细的魔方转动,还会用到:M(Middle)与U、F、L合用,指代各中层;C(Complete)与U、F、L合用,指代魔方整体以某层的形式旋转。

    • 例如:MU,以顶面视角,将中间层顺时针旋转90°。从正面视角来看,即上数第二层“向左”转90°。
    • 例如:CF,以正面视角,将魔方整体顺时针旋转90°。即魔方整体沿竖直面“向右”转90°。
    二阶魔方、三阶魔方、四阶魔方、五阶魔方,标准色、彩色等多种配色

    公式符号总表

    三阶魔方辛马斯特标记总表:

    ca75bbbaae45c31591e7fe330d20bbce.png

    专注于初学者的魔方教程

    • 知乎专栏:魔方
    • 微信公众号:碧海风云

    完整教程,通过以下方法获取

    《碧海风云三阶魔方公式符号总表》,访问以下链接获取:

    碧海风云三阶魔方公式符号总表​pan.baidu.com

    内容说明:另附三阶魔方完整教程,适合初学者快速掌握!


    版本说明

    当前版本:V2.0

    V2.0——2017年12月15日

    优化辛马斯特标记(公式符号)示意图。

    V1.0——2017年4月13日

    初版

    展开全文
  • [解决]POI 公式不支持跨工作表

    千次阅读 2015-11-11 15:15:20
    由于我使用的poi版本是3.10,在编译跨工作的公式:SUM('A:B'!A1)公式的时间报错, java.lang.IllegalArgumentException: Invalid sheetIndex: -1. at org.apache.poi.ss.formula.SheetRefEvaluator.&lt;init&...
  • poi 公式缓存,多次计算公式值不变

    千次阅读 2016-03-10 12:59:28
    原因是poi缓存了之前公式的计算结果,被引用单元格值改变了再次计算公式的值是缓存的值,这种设计加快了poi的计算速度,单数计算的数据不准确。为此我们需要禁止poi缓存公式的值。 实时获取计算式的值的两种方法 用...
  • poi.version>5.0.0</poi.version> <hutool.version>5.7.7</hutool.version> <lombok.version>1.18.20</lombok.version> </properties> <dependencies>
  • POI导出EXCEL公式生效

    千次阅读 2019-05-07 17:16:20
    1:在cell.setCellFormula里写如公式,比如 cell.setCellFormula("A1+A2"); 2:在最后:wb.setForceFormulaRecalculation(true); 如果还是不成功,导出是根据模板导出的话,就设置EXCEL公式为自动计算 公式--》...
  • Java Poi向下填充公式

    2021-08-14 12:31:14
    向下拉一行后,公式跟随改变 ...java poi excel公式自动向下填充方法: package test; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.ss.formula.EvaluationWor...
  • poi 插入公式

    千次阅读 2018-11-15 09:42:20
    Cell cell = row.createCell(colIdx++);  CellAddress a =row.createCell(colIdx).getAddress();  CellAddress b =row.createCell(colIdx+4...
  • POI公式的支持

    2019-01-09 20:37:25
    POI公式的支持 2009年11月26日 09:48:00 山巅 阅读数:7078 标签: stringc 更多 个人分类: POI 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • } 最后,这是我测试时用的的包 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss....
  • 她们在计算合计时是通过excel公式计算的,而我本地是直接输入的。这就导致了一个问题的出现。 获取到的值为null,我不能通过常规方法获取公式计算出来的值。 在经过网上一番查找答案之后,终于找到了一个简单高效的...
  • 如何使用Apache POI设置Excel的公式字段 1. 概述 在本文中,我们将通过一个简单的示例来演示如何使用Apache POI在Microsoft Excel电子表格中设置公式字段 2. Apache POI Apache POI是一个流行的开源Java库,它提供了...
  • 文章目录 前言 Excel准备 计算公式读取 直接读取 屠龙秘技 再直接读取 再通过计算公式读取 完整代码 往期回顾 前言 在上期:【Apache POI】Excel操作(五):Excel数据的读取 的博客中,如果有细心的小伙伴的话,...
  • POI执行EXCEL中的公式

    千次阅读 2018-12-05 15:00:12
    当EXCEL中包含计算公式时,利用POI去执行的方法如下。 第一种,当你知道你要执行的workbook类型时(HSSF 或者XSSF),可以直接调用静态方法,一次将workbook上的所有公式计算完毕。 File tempFile = new File(&...
  • 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 109 // 其余数据类型,根据官方文档,完全可以忽略http: // poi.apache.org/spreadsheet/eval.html 110 switch ...
  • JAVA POI 1.17读取模板公式数据问题 最近在开发过程中碰到了一个这样的需求:工程内导入一个excel模板,模板有四个sheet页,第一个sheet页用来填充从数据库中读取的原始数据,剩余的三个sheet页全都是各种各样的计算...
  • case Cell.CELL_TYPE_FORMULA: // 公式 cellValue =NumberToTextConverter.toText(cell.getNumericCellValue());//重点,无精度缺失的确切值. break; case Cell.CELL_TYPE_BLANK: // 空值 cellValue = ""; ...
  • 按照官方文档http://poi.apache.org/hssf/eval.html上面的源代码CellReference cellReference = new CellReference("B3"); HSSFRow row = sheet.getRow(cellReference.getRow());HSSFCell cell = row.getCell...
  • POI按模板导出Excel刷新公式

    千次阅读 2019-05-23 21:05:50
    通过POI导出excel,若是原excel模板中包含公式,默认情况下公式是不起作用的。需要通过添加下面这一行代码: sheet.setForceFormulaRecalculation(true); 基本案例:默认excel模板样式 其中C列是通过A列+B列的...
  • POI导出excel并支持公式计算

    千次阅读 2019-08-19 09:38:15
    项目中业务反映导出的excel不能再做其他的计算,不支持求和、平均之类的公式计算。这是因为在给单元格赋值的时候并没有给其指定单元格格式所导致的。 可以用如下方式指定单元格格式,使其支持公式运算: XSSFSheet ...
  • POI读取公式的值

    千次阅读 2015-01-25 21:56:00
    package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache....
  • Java poi读取Excel中公式的计算值

    千次阅读 2020-06-02 16:09:34
    读取Excel表格,如果是 数值型 可能遇到公式 导致读取不到 switch (thecell.getCellType()) { // 读取到的是公式 case Cell.CELL_TYPE_FORMULA: String valueStr = ""; try { valueStr = String.valueOf(the...
  • 在导入含有公式的表格时,poi把表格的公式打印出来,这显然不是我想要的。 if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){ return cell.getCellFormula() ; 把上面的代码改成如下 if(cell.getCellType() ...
  • JAVA POI 出力EXCEL时,EXCEL模板中的公式无效问题 工作中遇到一个问题。 EXCEL模板有两个sheet,画面内容要出力到第二个sheet中,第一个sheet设置公式,读取第二个sheet的内容进行计算。 出现了这样一个问题,画面...
  • poi 公式自動重新計算

    2013-05-28 11:06:00
    使用poi給excel設定公式後,產生excel,公式沒有計算 使用以下方法,重新計算公式: private void reCalculating(){ FormulaEvaluator evaluator = wbo.getCreationHelper().createFormulaEvaluator(); for...
  • 解决excelPoi模板导出时公式不自动计算的问题,亲测有效 需求:多列数据合并,自动计算值。 过程: 一开始自动计算值,用的是: =SUM(G4:G16) 并且已经按网上说的添加了poi的配置,并通过formulaEvaluator对...
  • excel模板在项目中,通过代码填充数据后,在下方的单元格里能够通过公式自动计算出结果,结果是,数据能填充,但是公式不能自动执行,只能打开生成的文件,双击数据单元格后,才能自动执行公式; 采用方案: &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,103
精华内容 2,841
关键字:

poi公式