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

JAVA Apache POI自定义格式

西门凯康
2023-03-14

我正在使用poi版本:3.14

我访问Excel(.xlsx)文件

this.workbook = WorkbookFactory.create(new FileInputStream(f.getPath()));
this.workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK);
this.sheet = workbook.getSheetAt(0);

下面是应用于单元格的.xlsx文件中的自定义格式。我想在代码中显示单元格值。

    null
cell.setCellType(Cell.CELL_TYPE_STRING);

>

  • cell.getStringCellValue()=>“42153283700100”
  • Cell.GetRichStringCellValue()=>“42153283700100”

    带有formatCellValue(cell)方法的旧HSSFDataFormatter=>“421532837001000316”

  • 共有1个答案

    段干宏硕
    2023-03-14

    对于数字格式,应使用CellGeneralFormatterCellNumberFormatter

    示例:

    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    
    import org.apache.poi.ss.format.*;
    
    import java.io.IOException;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.io.FileInputStream;
    
    class ReadExcelWithFormats {
    
     public static void main(String[] args) {
      try {
    
       InputStream inp = new FileInputStream("workbook.xlsx");
       Workbook wb = WorkbookFactory.create(inp);
    
       Sheet sheet = wb.getSheetAt(0);
    
       for (Row row : sheet) {
    
        for (Cell cell : row) {
    
         String formatstring = cell.getCellStyle().getDataFormatString();
         System.out.println(formatstring);
    
         switch (cell.getCellType()) {
    
          //...
    
          case Cell.CELL_TYPE_NUMERIC:
           double cellvalue = cell.getNumericCellValue();
    
           System.out.println(cellvalue);
    
           String formattedvalue = "";
    
           if ("general".equals(formatstring.toLowerCase())) {
            formattedvalue = new CellGeneralFormatter().format(cellvalue);
           } else {
            formattedvalue = new CellNumberFormatter(formatstring).format(cellvalue);
           }
    
           System.out.println(formattedvalue);
    
          break;
    
          //...
    
          default:
           System.out.println();
         }
        }
       }
    
      } catch (InvalidFormatException ifex) {
      } catch (FileNotFoundException fnfex) {
      } catch (IOException ioex) {
      }
     }
    }
    

    编辑

    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    
    import org.apache.poi.ss.format.*;
    
    import java.io.IOException;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.io.FileInputStream;
    
    import java.util.Date;
    
    class ReadExcelWithFormats {
    
     public static void main(String[] args) {
      try {
    
       InputStream inp = new FileInputStream("workbook.xlsx");
       Workbook wb = WorkbookFactory.create(inp);
    
       Sheet sheet = wb.getSheetAt(0);
    
       for (Row row : sheet) {
    
        for (Cell cell : row) {
    
         String formatstring = cell.getCellStyle().getDataFormatString();
         System.out.println(formatstring);
    
         switch (cell.getCellType()) {
    
          //...
    
          case Cell.CELL_TYPE_NUMERIC:
    
           String formattedvalue = "";
           String[] formatstringparts = formatstring.split(";");
    
           if (DateUtil.isCellDateFormatted(cell)) {
    
            Date date = cell.getDateCellValue();
            System.out.println(date);
    
            String dateformatstring = "";
            if (cell.getCellStyle().getDataFormat() == 14) { //default short date without explicit formatting
             dateformatstring = "yyyy-MM-dd"; //default date format for this
            } else if (cell.getCellStyle().getDataFormat() == 22) { //default short datetime without explicit formatting
             dateformatstring = "yyyy-MM-dd hh:mm"; //default datetime format for this
            } else { //other data formats with explicit formatting
             dateformatstring = formatstringparts[0];
            }
            formattedvalue = new CellDateFormatter(dateformatstring).format(date);
           } else {
    
            double cellvalue = cell.getNumericCellValue();
            System.out.println(cellvalue);
    
            switch (formatstringparts.length) {
             case 4:
             case 3:
              if (cellvalue > 0) {
               if ("general".equals(formatstringparts[0].toLowerCase())) {
                formattedvalue = new CellGeneralFormatter().format(cellvalue);
               } else {
                formattedvalue = new CellNumberFormatter(formatstringparts[0]).format(cellvalue);
               }
              }
              if (cellvalue < 0) {
               if ("general".equals(formatstringparts[1].toLowerCase())) {
                formattedvalue = new CellGeneralFormatter().format(cellvalue);
               } else {
                formattedvalue = new CellNumberFormatter(formatstringparts[1]).format(cellvalue);
               }
              }
              if (cellvalue == 0) {
               if ("general".equals(formatstringparts[2].toLowerCase())) {
                formattedvalue = new CellGeneralFormatter().format(cellvalue);
               } else {
                formattedvalue = new CellNumberFormatter(formatstringparts[2]).format(cellvalue);
               }
              }
             break;
             case 2:
              if (cellvalue >= 0) {
               if ("general".equals(formatstringparts[0].toLowerCase())) {
                formattedvalue = new CellGeneralFormatter().format(cellvalue);
               } else {
                formattedvalue = new CellNumberFormatter(formatstringparts[0]).format(cellvalue);
               }
              }
              if (cellvalue < 0) {
               if ("general".equals(formatstringparts[1].toLowerCase())) {
                formattedvalue = new CellGeneralFormatter().format(cellvalue);
               } else {
                formattedvalue = new CellNumberFormatter(formatstringparts[1]).format(cellvalue);
               }
              }
             break;
             default:
              if ("general".equals(formatstringparts[0].toLowerCase())) {
               formattedvalue = new CellGeneralFormatter().format(cellvalue);
              } else {
               formattedvalue = new CellNumberFormatter(formatstringparts[0]).format(cellvalue);
              }    
             }
    
           }
    
           System.out.println(formattedvalue);
    
          break;
    
          //...
    
          default:
           System.out.println();
         }
        }
       }
    
      } catch (InvalidFormatException ifex) {
      } catch (FileNotFoundException fnfex) {
      } catch (IOException ioex) {
      }
     }
    }
    
    ...
       InputStream inp = new FileInputStream("workbook.xlsx");
       Workbook wb = WorkbookFactory.create(inp);
    
       Sheet sheet = wb.getSheetAt(0);
    
       DataFormatter formatter = new DataFormatter();
    
       for (Row row : sheet) {
        for (Cell cell : row) {
         String formattedvalue = formatter.formatCellValue(cell);
         System.out.println("Using DataFormatter: " + formattedvalue);
        }
       }
    ...
    
     类似资料:
    • 是否可以使用用户扩展在Selenium IDE中创建自定义命令.js并使其能够将自身更改为自定义导出格式,如果是这样,如何? 我将使用SeleniumIDE记录测试,这些测试将以完全自定义的Java格式导出,作为全自动测试系统的一部分运行。格式不是JUnit,而是每个测试都是它自己的类,并根据整个系统的输入动态加载。 我想要做的是在Selenium IDE中创建一个名为“take snapshot

    • 我想通过LLCP在一个NDEF记录中的NDEF消息中传输一个自定义数据(或者有效载荷可能会被分块到几个NDEF中)。传输的内容是具有特定格式的文件,仅在特定应用中具有意义。那么,指定NDEF头的最佳方法是什么? 1) 将TNF设置为0x04(NFC论坛外部类型),0x03(绝对URI)或0x05(未知)?0x04将在 TYPE 字段中具有自定义相对 URI,如果是绝对 URI,则0x03绝对 UR

    • 本文向大家介绍.NET Framework 格式:自定义DateTime格式,包括了.NET Framework 格式:自定义DateTime格式的使用技巧和注意事项,需要的朋友参考一下 示例            

    • 本文向大家介绍jquery自定义表格样式,包括了jquery自定义表格样式的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery自定义表格样式实现代码。分享给大家供大家参考。具体如下: 运行效果截图如下: 上面这张图有3种状态,默认状态(灰白相间),鼠标悬浮状态(绿色),鼠标点击状态(黄色),是如何实现的呐? Html代码如下: 插件实现代码如下: 有些时候我们可能并不需要鼠标点击后

    • 问题内容: 我有一个非常简单的表格: 这是自定义表单验证的完成方式吗?我需要评估该电子邮件地址当前没有用户存在。我还需要评估并匹配。我该怎么做呢? 问题答案: 要单独验证单个字段,可以在表单中使用clean_FIELDNAME()方法,因此对于电子邮件: 然后对于相互依赖的共同依赖字段,你可以覆盖在单独验证所有字段(email如上)之后运行的 方法: 我不确定你从哪里来,但是看起来这是为m你的表单

    • 我想把时间放进牢房。我需要它是独立的,没有年,月,日数据日期时间的附件 当我尝试以h:mm AM/PM格式编写字符串15:55:00时,它会在excel工作表上显示为15:55:00,直到我选择单元格并按enter键,所以这似乎不是一种有效的方法。 传递日期时间是有效的,但我不想在我的手机里有日期信息,只想正确格式化时间。 我目前的代码如下: