我正在使用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错误
答案 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);
...
。但这也可以通过用户编辑工作表来更改。