亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我在通過 Apache POI 添加計算字段時遇到問題

我在通過 Apache POI 添加計算字段時遇到問題

夢里花落0921 2023-10-13 09:44:48
我正在嘗試通過 Apache POI 添加計算字段,當只有一個非計算字段而其余其他字段是計算字段時,我遇到問題 我在打開 excel 工作表時遇到錯誤,如下所示錯誤圖像但是,當有多個非計算字段時,Excel 工作表不會拋出任何錯誤,并且計算字段顯示正常。添加一個或多個列標簽時沒有錯誤。有人可以幫我解決這個問題嗎?實際產量預期輸出只有一個非計算列和一個計算列,如下所示。預期產出
查看完整描述

1 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

數據透視表定義中有一個元素,如果有多個數據字段作為列字段,colFields則至少需要一個元素。field但apache poi如果僅設置一個列標簽,則不會添加該字段,因為如果僅存在一個列字段,則不需要該字段。


但由于您低級別添加了一個數據字段作為列字段,因此它缺少該 colFields字段。這就是為什么在打開文件時出錯的原因Excel。


如果設置了多個列標簽,則apache poi添加該colFields字段。這就是它起作用的原因。


因此,在低級別創建數據字段后,將以下內容添加到您的代碼中:


...

   // at least one field in colFields is needed if there are multiple data fields

   CTColFields colFields;

   if(pivotTable.getCTPivotTableDefinition().getColFields() != null) {

    colFields = pivotTable.getCTPivotTableDefinition().getColFields();

   } else {

    colFields = pivotTable.getCTPivotTableDefinition().addNewColFields();

   }

   CTField field;

   if (colFields.getFieldList().size() == 0) {

    field = colFields.addNewField();

    field.setX(-2);

   }

...

這將添加一個新colFields元素(如果尚不存在)。它會field在那里添加該元素(如果尚未存在)。


再次完整的例子:


import java.io.FileOutputStream;


import org.apache.poi.ss.SpreadsheetVersion;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.*;

import org.apache.poi.xssf.usermodel.*;

import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;


class CreatePivotTableCalculatedFields {


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

  createPivotTable();

 }


 private static void createPivotTable() throws Exception {

  try (XSSFWorkbook wb = new XSSFWorkbook(); 

       FileOutputStream fileOut = new FileOutputStream("Output.xlsx")) {


   XSSFSheet dataSheet = wb.createSheet("1econtent");

   XSSFSheet pivotSheet = wb.createSheet("1e");


   setCellData(dataSheet, wb);


   AreaReference source = new AreaReference("A1:F5", SpreadsheetVersion.EXCEL2007);

   CellReference position = new CellReference(0,0);


   XSSFPivotTable pivotTable = pivotSheet.createPivotTable(source, position,wb.getSheet("1econtent"));

   pivotTable.addRowLabel(2);

   pivotTable.addRowLabel(0);


   pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3);


   pivotSheet.setDisplayGridlines(false);


   wb.setSelectedTab(1);

   wb.setActiveSheet(1);


   // customize pivot table

   CTCacheFields ctCacheFields = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields();

   CTCacheField ctCacheField = ctCacheFields.addNewCacheField();

   ctCacheField.setName("Field");

   ctCacheField.setFormula("'Actuals' / 'Estimates'");

   ctCacheField.setDatabaseField(false);

   ctCacheFields.setCount(ctCacheFields.sizeOfCacheFieldArray());


   CTPivotField pivotField = pivotTable.getCTPivotTableDefinition().getPivotFields().addNewPivotField();

   pivotField.setDataField(true);

   pivotField.setDragToCol(false);

   pivotField.setDragToPage(false);

   pivotField.setDragToRow(false);

   pivotField.setShowAll(false);

   pivotField.setDefaultSubtotal(false);


   CTDataFields dataFields;

   if(pivotTable.getCTPivotTableDefinition().getDataFields() != null) {

    dataFields = pivotTable.getCTPivotTableDefinition().getDataFields();

   } else {

    dataFields = pivotTable.getCTPivotTableDefinition().addNewDataFields();

   }

   CTDataField dataField = dataFields.addNewDataField();

   dataField.setName("Calculated Field");

   dataField.setFld(pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCount()-1);

   dataField.setBaseItem(0);

   dataField.setBaseField(0);

   DataFormat dataformat =  pivotTable.getParentSheet().getWorkbook().createDataFormat();

   short numFmtId = dataformat.getFormat("0.0%");

   dataField.setNumFmtId(numFmtId);


   // at least one field in colFields is needed if there are multiple data fields

   CTColFields colFields;

   if(pivotTable.getCTPivotTableDefinition().getColFields() != null) {

    colFields = pivotTable.getCTPivotTableDefinition().getColFields();

   } else {

    colFields = pivotTable.getCTPivotTableDefinition().addNewColFields();

   }

   CTField field;

   if (colFields.getFieldList().size() == 0) {

    field = colFields.addNewField();

    field.setX(-2);

   }


   wb.write(fileOut);

  }

 }


 public static void setCellData(XSSFSheet sheet, XSSFWorkbook wb){

  Object[][] data = new Object[][] {

   new Object[] {"Names", "Age", "Dept", "Salary", "Actuals", "Estimates"},

   new Object[] {"Adam", 22d, "Sales", 10d, 12d, 60d},

   new Object[] {"Bran", 24d, "Finance", 20d, 24d, 60d},

   new Object[] {"Jane", 23d, "IT", 30d, 30d, 60d},

   new Object[] {"Dave", 30d, "Sales", 50d, 6d, 60d}

  };


  XSSFRow row;

  XSSFCell cell;

  for (int r = 0; r < data.length; r++) {

   row = sheet.createRow(r);

   for (int c = 0 ; c < data[r].length; c++) {

    cell = row.createCell(c);

    if (data[r][c] instanceof String) {

     cell.setCellValue((String)data[r][c]);

    } else if (data[r][c] instanceof Double) {

     cell.setCellValue((Double)data[r][c]);

    }

   }

  }

 } 

}



查看完整回答
反對 回復 2023-10-13
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號