java - Apache-poi 模板前导零在编辑单元格时消失

标签 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

最佳答案

无法重现您的问题。

以下代码创建一个 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 不会将列样式应用于该列中新创建的单元格。您需要在代码中执行此操作,否则单元格样式将为常规。尽管如此,设置列样式还是必要的,因为否则 ExcelGUI 在添加单元格内容时将不会使用文本样式。

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

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

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

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

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

关于java - Apache-poi 模板前导零在编辑单元格时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246395/

相关文章:

java - 使用 slf4j 读取 .properties 文件

java - 如何覆盖此方法的所有分支?

scala - 如何在 akka http 中通过 POST 指定下载的文件名

r - 如何在栅格处理中保留栅格数据类型?

java - JMeter 是否完全支持 NTLM 身份验证?

java - 如何使用 Java 从 Word 文件中检索数字签名数据?

java - Apache 兴趣点: "Cannot resolve symbol"

javascript - JSON格式有替代品吗?

java - 我如何将时间从毫秒转换为日期?

java - 为什么我在 Java 中使用正则表达式得到非法转义字符?