我正在使用 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
不会将列样式应用于该列中新创建的单元格。您需要在代码中执行此操作,否则单元格样式将为常规
。尽管如此,设置列样式还是必要的,因为否则 Excel
的 GUI
在添加单元格内容时将不会使用文本样式。
我的代码是完整的、经过测试的并且适合我。由于使用数字格式 @ = 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/