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

apache poi将hh:mm:ss字符串写入Excel时间数据类型

戈宏义
2023-03-14

我使用apache poi将一个CSV文件重写到Excel,对于hh:mm:ss这样的字符串,我需要将其转换为适当的Excel数据类型,以便用户可以对该列应用sum()函数。我尝试了不同的数据类型,但当我打开excel文件时,我无法对该列进行求和,求和总是显示为“0:00:00”,即使单击excel中的该列显示为“Time”数据类型,

下面是我的代码:

CreationHelper creationHelper = workbook.getCreationHelper();
HSSFCellStyle timeStyle = workbook.createCellStyle();          
timeStyle.setDataFormat(creationHelper.createDataFormat().getFormat("h:mm:ss"));
cell.setCellValue(column);
if (isTime(column)) {
  cell.setCellStyle(timeStyle);
}

private boolean isTime(String value) {
        try {
            dtf.parseDateTime(value);
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }

共有1个答案

严扬
2023-03-14

如果代码中的对象columnstring,则单元格的内容将始终是cell.SetCellValue(column)之后的字符串(文本)单元格内容。函数sum无法使用此内容。这些函数需要数字内容。在Excel中,日期和时间也是数字内容,仅格式化为日期-时间。默认设置为1=1天=01/01/1900 00:00:00。1小时=1/24,1分钟=1/24/60,1秒=1/24/60/60。

如果column是格式为“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.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DateUtil;

public class ExcelCalculateTimeValues {

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

  Workbook workbook = new HSSFWorkbook();
  //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("Time sting");
  sheet.getRow(0).createCell(1).setCellValue("Time");

  String[][] tableData = new String[][]{
   {"12:34:00", "22:45:00"},
   {"23:45:05", "01:34:40"},
   {"08:01:00", "13:23:00"},
   {"15:41:12", "23:23:22"}
  };

  int r = 1;
  for (String[] rowData : tableData) {
   Row row = sheet.createRow(r++);
   int c = 0;
   for (String cellData : rowData) {
    Cell cell = row.createCell(c);
    if (c == 0 ) {
     cell.setCellValue(cellData); //this sets string cell data
    } else if (c == 1) {
     cell.setCellValue(DateUtil.convertTime(cellData)); //this sets datetime cell data
    }
    cell.setCellStyle(styletime);
    c++;
   }
  }

  sheet.createRow(r).createCell(0).setCellFormula("SUM(A2:A"+r+")"); //cannot work because of string values in A2:A4
  sheet.getRow(r).createCell(1).setCellFormula("SUM(B2:B"+r+")"); //will work

  workbook.setForceFormulaRecalculation(true);

  if (workbook instanceof HSSFWorkbook) {
   workbook.write(new FileOutputStream("ExcelCalculateTimeValues.xls"));
  } else if (workbook instanceof XSSFWorkbook) {
   workbook.write(new FileOutputStream("ExcelCalculateTimeValues.xlsx"));
  }
  workbook.close();

 }

}
 类似资料:
  • 问题内容: 我想将持续时间(即秒数)转换为以冒号分隔的时间字符串(hh:mm:ss) 我在这里找到了一些有用的答案,但他们都谈论转换为x小时和x分钟格式。 那么,有没有一个小片段在jQuery或原始JavaScript中做到这一点? 问题答案: 您现在可以像这样使用它: 工作片段:

  • 问题内容: 我正在尝试使用以下脚本创建一个包含Python中字符串列表内容的csv文件。但是,当我检查输出文件时,发现每个字符都用逗号分隔。如何指示定界列表中的每个字符串而不是每个字符? 我检查了PEP 305,找不到任何特定的东西。 问题答案: 该方法以iterable作为参数。您的结果集必须是列表(列)的列表(行)。 将 行 参数写入编写者的文件对象,并根据当前方言格式化。 执行以下任一操作:

  • 我有几个输出侦听器正在实现。它可以是写到stdout或文件的,也可以是写到内存或任何其他输出目标;因此,我在方法中指定作为(an)参数。 现在,我收到了。在这里向流写入的最佳方式是什么? 我应该只使用吗?我可以给它字节,但如果目标流是字符流,那么它会自动转换吗? 我需要用这里的一些桥流来代替吗?

  • 问题内容: 我有几个正在实现OutputStream的输出侦听器。它可以是写到stdout或文件的PrintStream,也可以写到内存或任何其他输出目标。因此,我在方法中将OutputStream指定为参数。 现在,我已经收到了字符串。在此处写入流的最佳方法是什么? 我应该只使用Writer.write(message.getBytes())吗?我可以给它提供字节,但是如果目标流是字符流,那么它

  • wef:使用apache poi写入xlsm(Excel 2007) 当我向文件中写入一个简单的字符串时,我无法打开该文件。错误-“Excel无法打开文件“Test1.xlsm”,因为文件格式或文件扩展名无效”

  • 问题内容: 我正在使用Apache POI读取Excel文件。在阅读时,我注意到它将字符串作为浮点值。 如果我的单元格包含1,则它将获取为1.0 我从以前的问题中得到了一些提示,并修改了代码,但float表示仍然保持原样。 如何正确读取字符串和日期的数据? 问题答案: 对评论发表评论 问题是电话 这样做是在要求POI尝试将单元格从当前单元格(例如数字)转换为字符串。尝试执行此转换非常简单,这就是为