【问题标题】:Apache-poi template leading zeros disappear on editing cellsApache-poi 模板前导零在编辑单元格时消失
【发布时间】:2019-05-21 21:08:12
【问题描述】:

我正在使用 apache-poi 创建一个 .xlsx 模板,用户必须插入一个固定长度的 id。

我已经尝试过 setDataFormat(workbook.createDataFormat().getFormat("@")) 技巧,但是当单元格被编辑时,它似乎忘记了这一点,并且前导零消失了。

//this is the code snippet i found here on stackoverflow and tried out
DataFormat fmt = workbook.createDataFormat();
CellStyle textStyle = workbook.createCellStyle();
textStyle.setDataFormat(fmt.getFormat("@"));
worksheet.setDefaultColumnStyle(0, textStyle);

找到一个真正的解决方案会很棒,因为添加前导零以获得预期长度可能会导致错误。例如:用户的意思是 0000111 但忘记了 1 ,新的 id 将是 0000011 不幸的是 id 不是连续的。

感谢您的时间,并原谅我的英语不好XD

【问题讨论】:

    标签: java apache-poi dataformat leading-zero


    【解决方案1】:

    无法重现您的问题。

    以下代码创建了一个 Excel 工作表,其 ID 在 A 列中,即使在 Excels GUI 中编辑也不会丢失其文本格式和前导零。

    import java.io.FileOutputStream;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    class CreateExcelNumberFormatText {
    
     public static void main(String[] args) throws Exception {
    
      try (Workbook workbook = new XSSFWorkbook(); 
           FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {
    
       DataFormat format = workbook.createDataFormat();
       CellStyle textStyle = workbook.createCellStyle();
       textStyle.setDataFormat(format.getFormat("@"));
    
       Sheet sheet = workbook.createSheet(); 
       sheet.setDefaultColumnStyle(0, textStyle);
    
       Cell cell = sheet.createRow(0).createCell(0);
       cell.setCellStyle(textStyle);
       cell.setCellValue("Id");
    
       cell = sheet.createRow(1).createCell(0);
       cell.setCellStyle(textStyle);
       cell.setCellValue("0000111");
    
       cell = sheet.createRow(2).createCell(0);
       cell.setCellStyle(textStyle);
       cell.setCellValue("0001111");
    
       workbook.write(fileout);
      }
    
     }
    }
    

    您可能没想到的是apache poi 不会将列样式应用于该列中新创建的单元格。您需要在代码中执行此操作,否则单元格样式将为General。尽管如此,设置列样式仍然是必要的,因为否则Excels GUI 在添加单元格内容时不会使用文本样式。

    我的代码是完整的、经过测试的并且适合我。简单地编辑Excel 中的单元格不会导致丢失部分单元格内容(前导零),因为使用了数字格式@ = Text

    当然,如果有人将列号格式从Text更改为General,那么0000111将是编辑后的数字111。但是当用户可以编辑工作表时,这是无法避免的。

    也许可以另外设置CellStyle.setQuotePrefixed。如:

    ...
       textStyle.setDataFormat(format.getFormat("@"));
       textStyle.setQuotePrefixed(true);
    ...
    

    然后所有内容都将附加一个引号前缀撇号'。但这也可以通过用户编辑工作表来更改。

    【讨论】:

    • 不幸的是,这正是我的意思,在我的情况下不起作用。当用户在模板上书写时,前导零消失
    • @NicoloB91:看我的补充。
    • 首先感谢您的宝贵时间。我会尽快评估 ' 解决方案的优缺点。
    【解决方案2】:

    这是我的解决方案:

    cell = row.createCell(col, CellType.STRING);
    cell.setCellValue(val);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多