Apache-POI模板的前导零在编辑单元格中消失

时间:2019-05-21 21:08:13

标签: java apache-poi dataformat leading-zero

我正在使用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错误

1 个答案:

答案 0 :(得分:0)

无法重现您的问题。

以下代码创建了一个Excel表,其中A列中的ID即使在Excel s 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。尽管如此,仍需要设置列样式,因为在此添加单元格内容时,Excel的{​​{1}}不会使用文本样式。

我的代码是完整的,经过测试的并且可以为我工作。由于使用数字格式GUI,仅编辑Excel中的单元格不会导致部分单元内容(前导零)丢失。

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

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

111

然后,所有内容将另外加上引号前缀撇号... textStyle.setDataFormat(format.getFormat("@")); textStyle.setQuotePrefixed(true); ... 。但这也可以通过用户编辑工作表来更改。