为了账号安全,请及时绑定邮箱和手机立即绑定

Apache-POI 在 Excel 中设置值,但另一个单元格的公式无法使用该值

Apache-POI 在 Excel 中设置值,但另一个单元格的公式无法使用该值

交互式爱情 2021-05-31 21:15:35
我写了一个程序,将值写入 xlsx 文件。乍一看,它似乎可以正常工作。但是在我的 xlsx 文件中,我在另一个单元格中有一个公式,如果我手动输入该值应该可以正常工作,但是如果我的程序设置了完全相同的值,它就不会像它应该的那样工作。如果我在我的程序写入一个值后手动打开文件并通过按处理条中的输入按钮确认写入的值,它会像它应该的那样工作。没有抛出异常。我的程序正在单元格 N4 和 O4 中写入。这是我正在谈论的单元格的 Excel 公式:=+MAX(;MIN(O4+(N4>O4);MAX(($N$2>$O$2);$O$2))-MAX(N4;$N$2))+MAX(;MIN(O4;MAX) (($N$2>$O$2);$O$2))-MAX(;$N$2)) (N4>O4)+MAX(;MIN(O4+(N4>O4);MIN(($N$2> $O$2);$O$2))-MAX(N4;))+MIN(O4;MIN(($N$2>$O$2);$O$2)) (N4>O4)
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

在您的代码部分之后:


...

String timeF = tf.substring(0, 5); 

cellTimeF.setCellValue(timeF);

...

单元格内容将始终是字符串(文本)单元格内容。该内容的功能MIN和MAX不能使用。这些函数需要数字内容。在Excel日期和时间中也是数字内容仅格式化为日期时间。默认设置为 1 = 1 天 = 01/01/1900 00:00:00。1 小时 = 1/24,1 分钟 = 1/24/60,1 秒 = 1/24/60/60。


如果String timeF是格式为“HH:MM:SS”的字符串,则可以使用DateUtil.convertTime将此字符串转换为Excel有价值的时间。


完整示例,显示什么不起作用以及什么起作用:


import java.io.FileOutputStream;


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

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

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


public class ExcelCalculateTimeValues {


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


  Workbook workbook = new XSSFWorkbook();


  CreationHelper createHelper = workbook.getCreationHelper();

  CellStyle styletime = workbook.createCellStyle();

  styletime.setDataFormat(createHelper.createDataFormat().getFormat("hh:mm:ss"));


  Sheet sheet = workbook.createSheet();

  sheet.createRow(0).createCell(0).setCellValue("Start");

  sheet.getRow(0).createCell(1).setCellValue("End");

  sheet.getRow(0).createCell(3).setCellValue("Start");

  sheet.getRow(0).createCell(4).setCellValue("End");


  String[][] tableData = new String[][]{

   {"12:34:00", "22:45:00"},

   {"23:45:00", "01:34:00"},

   {"08:01:00", "13:23:00"}

  };


  int r = 1;

  for (String[] rowData : tableData) {

   Row row = sheet.createRow(r++);

   int c = 0;

   for (String cellData : rowData) {

    Cell cell = row.createCell(c);

    cell.setCellValue(cellData); //this sets string cell data

    cell.setCellStyle(styletime);

    cell = row.createCell(3 + c++);

    cell.setCellValue(DateUtil.convertTime(cellData)); //this sets datetime cell data

    cell.setCellStyle(styletime);

   }

  }


  sheet.createRow(r).createCell(0).setCellFormula("MIN(A2:A4)"); //cannot work because of string values in A2:A4

  sheet.getRow(r).createCell(1).setCellFormula("MIN(B2:B4)"); //cannot work because of string values in B2:B4

  sheet.getRow(r).createCell(3).setCellFormula("MIN(D2:D4)"); //will work

  sheet.getRow(r).createCell(4).setCellFormula("MIN(E2:E4)"); //will work


  workbook.setForceFormulaRecalculation(true);


  workbook.write(new FileOutputStream("ExcelCalculateTimeValues.xlsx"));

  workbook.close();


 }


}

所以用你的代码:


...

cellTimeF.setCellValue(DateUtil.convertTime(timeF));

...


...

cellTimeT.setCellValue(DateUtil.convertTime(timeT));

...

应该管用。



查看完整回答
反对 回复 2021-06-02
  • 1 回答
  • 0 关注
  • 416 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信