当前位置: 首页 > 知识库问答 >
问题:

如何在Apache POI中设置有表列字段公式

狄凯
2023-03-14

我的XSSFTable中的一列是引用此表中另一列的公式。

例如,在XSSFTabletblcolumna中,公式为:=[@[ColumnB]],我可以通过cell.setcellFormula(“tbl[[#this Row],[ColumnB]]”)columna中的每个单元格上设置公式,但在Excel中打开时会出现问题,Excel必须删除该公式才能正确显示工作表。

此问题只发生在创建空白的新XSSFWorkbook时,如果它是从Excel创建的现有.xlsx文件加载的,则可以通过cell.setCellFormula()修改公式,并在Excel中正确打开。

如果有什么样例代码可以在这种情况下正确工作?

共有1个答案

熊俊人
2023-03-14

链接示例的主要问题是它将所有列命名为“column”:

...
        for(int i=0; i<3; i++) {
            //Create column
            column = columns.addNewTableColumn();
            column.setName("Column");
            column.setId(i+1);
...

因此公式解析器不能区分它们。

但是使用一个循环填充表列标题和填充工作表内容的整个逻辑并不是很容易理解的。所以这里有一个更合适的例子:

public class CreateTable {

    public static void main(String[] args) throws IOException {

        Workbook wb = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) wb.createSheet();

        //Create 
        XSSFTable table = sheet.createTable();
        table.setDisplayName("Test");       
        CTTable cttable = table.getCTTable();

        //Style configurations
        CTTableStyleInfo style = cttable.addNewTableStyleInfo();
        style.setName("TableStyleMedium2");
        style.setShowColumnStripes(false);
        style.setShowRowStripes(true);

        //Set which area the table should be placed in
        AreaReference reference = new AreaReference(new CellReference(0, 0), 
                new CellReference(4,2));
        cttable.setRef(reference.formatAsString());
        cttable.setId(1);
        cttable.setName("Test");
        cttable.setTotalsRowCount(1);

        CTTableColumns columns = cttable.addNewTableColumns();
        columns.setCount(3);
        CTTableColumn column;
        XSSFRow row;
        XSSFCell cell;

        //Create 3 columns in table
        for(int i=0; i<3; i++) {
            column = columns.addNewTableColumn();
            column.setName("Column"+i);
            column.setId(i+1);
        }

        //Create sheet contents
        for(int i=0; i<5; i++) {//Create 5 rows
            row = sheet.createRow(i);
            for(int j=0; j<3; j++) {//Create 3 cells each row
                cell = row.createCell(j);
                if(i == 0) { //first row is for column headers
                    cell.setCellValue("Column"+j);
                } else if(i<4){ //next rows except last row are data rows, last row is totals row so don't put something in
                    if (j<2) cell.setCellValue((i+1)*(j+1)); //two data columns
                    else cell.setCellFormula("Test[[#This Row],[Column0]]*Test[[#This Row],[Column1]]"); //one formula column
                }
            }
        }

        FileOutputStream fileOut = new FileOutputStream("ooxml-table.xlsx");
        wb.write(fileOut);
        fileOut.close();
        wb.close();
    }
}
 类似资料:
  • 我在groovy/spock中测试了一个java类。java类有最后一个字段: 我想测试一个方法是否使用这个记录器,最好是使用模拟。问题是这个字段是最终的,所以我不能直接设置它。我知道有一些变通方法,比如: 修改ield.set字段field.get 但这些都是可怕的黑客。有没有更好的方法?

  • 问题内容: 是否可以 仅 在有序列表上设置样式或增加数字的大小? 我打算仅使用CSS 将有序列表转换为wikihow步骤。 问题答案: 可以使用CSS3来完成,但不能使用100%跨浏览器(即IE7)来完成。使用伪:before元素以及counter-reset和counter- increment,您可以隐藏列表样式并创建自己的样式。 同样在可怕的链接腐烂的情况下-这是所需的主要CSS代码(可以应

  • 问题内容: 有没有一种简单的方法可以为文本表单字段设置默认值? 问题答案: 可以在创建过程中轻松使用:

  • 问题内容: 如何在提交表单时在POST标头中设置自定义字段? 问题答案: 无法完成-AFAIK。 但是,您可以使用例如jquery(尽管您可以使用普通的javascript做到)来序列化表单并发送(使用AJAX),同时添加自定义标头。 查看将HTML FORM更改为可用于POST的值的jquery 。 我的建议是包括 隐藏的表单元素 查询字符串参数

  • 问题内容: 如何在Django(Python)中像Google App Engine(Python)中的ListProperty属性一样创建ListField ?我的数据是这样的名单:3,4,5,6,7,8。 我必须定义什么属性,以及如何从中获取值? 问题答案: 使用你可以使用的类型来重新研究它。但这有一些假设,例如你不在列表中存储复杂类型的事实。出于这个原因,我曾经强制只将简单的内置类型作为成员

  • 有人知道如何改变页面大小(从字母到A4)为(docx)吗? 我找不到任何像XSSFDocument(xlsx)中那样的打印设置。 谢谢你的帮助。