【问题标题】:Excel sheet removing zero(s) for number starting with zero(s)Excel 工作表删除以零开头的数字的零
【发布时间】:2019-12-09 00:25:55
【问题描述】:

我需要编写CSV/Xls 文件,其中有一列具有类似00078 的数字,但即使将数字写入字符串后,Excel 工作表也会将其显示为78

我已经尝试过 apache poi 库并尝试将单元格类型设置为字符串。

HSSFWorkbook workbook = new HSSFWorkbook(); 

// Create a blank sheet 
HSSFSheet sheet = workbook.createSheet("student Details"); 

// This data needs to be written (Object[]) 
Map<String, Object[]> data = new TreeMap<String, Object[]>(); 
data.put("1", new Object[]{ "ID", "NAME", "LASTNAME" }); 
data.put("2", new Object[]{ 00078, "Pankaj", "Kumar" }); 

// Iterate over data and write to sheet 
Set<String> keyset = data.keySet(); 
int rownum = 0; 
for (String key : keyset) { 
    // this creates a new row in the sheet 
    Row row = sheet.createRow(rownum++); 
    Object[] objArr = data.get(key); 
    int cellnum = 0; 
    for (Object obj : objArr) { 
        // this line creates a cell in the next column of that row 
        Cell cell = row.createCell(cellnum++); 
        if (obj instanceof String) 
            cell.setCellValue((String)obj); 
        else if (obj instanceof Integer){
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(String.valueOf(obj));
        }
    } 
} 

我希望该列将00078 视为字符串并显示相同的内容。

【问题讨论】:

  • 试试data.put("2", new Object[]{ "00078", "Pankaj", "Kumar" });添加引号,你现在有它作为一个数字。
  • 很好的建议@Adder 成功了。现在我想知道我怎么没看到它。但问题是我正在实现它的地方有这个数字作为整数类型的对象。
  • 请参阅pad a string 了解如何填充字符串 - 或仅使用 while 循环在达到宽度之前添加零。
  • 00078 as integer is 自动删除前导零。 0007878 相同。如果您想要前导零,请将值作为字符串存储在 java 中,或者稍后添加它们,但也可以作为字符串
  • 我成功编写了一个值为 00078 的 xls 文件,但是当我编辑单元格然后散焦时,它又回到了 78。

标签: java apache-poi xls


【解决方案1】:

我猜这样写会导致编译错误 -

整数太大

data.put("2", new Object[]{ 00078, "Pankaj", "Kumar" }); 

在 cmets Adder 说得对

data.put("2", new Object[]{ "00078", "Pankaj", "Kumar" });

这应该可以解决问题。

【讨论】:

  • 我成功编写了一个值为 00078 的 xls 文件,但是当我编辑单元格然后散焦时,它又回到了 78。
【解决方案2】:

如果ID 必须有前导零,则此ID 的数据类型必须为String。数字没有前导零。数字 000123 在数学上与 123 完全相同。

Excel 的情况下,包含此ID 值的单元格应具有Text 格式的单元格样式。并且为了防止通过编辑单元格将单元格样式更改为数字样式,额外的单元格样式应该加上引号前缀。否则编辑单元格可能会导致 000123 再次变为 123 的情况。

以下代码显示了一个完整的示例,其中ID 列以这种方式受到保护。

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.GregorianCalendar;

class CreateExcelSheetFromDataObjectArray {

 public static void main(String[] args) throws Exception {

  Object[][] data = new Object[][]{
   new Object[]{"ID", "NAME", "LASTNAME", "AMOUNT", "DATE"},
   new Object[]{"000123", "John", "Doe", 1234.56, new GregorianCalendar(2019, 0, 1) },
   new Object[]{"000456", "Jane", "Stiles", 7890.12, new GregorianCalendar(2019, 1, 11) },
   new Object[]{"000789", "Mary", "Major", 3456.78, new GregorianCalendar(2019, 2, 22) }
  };

  String filePath = "./Excel";

  String wantedXLFormat = 
   //"XSSF";
   "HSSF";

  try (Workbook workbook = ("XSSF".equals(wantedXLFormat))?new XSSFWorkbook():new HSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream(filePath + (("XSSF".equals(wantedXLFormat))?".xlsx":".xls")) ) {

   DataFormat dataFormat = workbook.createDataFormat();
   CellStyle dateStyle = workbook.createCellStyle();
   dateStyle.setDataFormat(dataFormat.getFormat("DDDD, MMMM, DD, YYYY"));
   CellStyle numberStyle = workbook.createCellStyle();
   numberStyle.setDataFormat(dataFormat.getFormat("#,##0.00 \" Coins\""));

   // the cell style for the ID column has Text format and is quote prefixed
   CellStyle idStyle = workbook.createCellStyle();
   idStyle.setDataFormat(dataFormat.getFormat("@"));
   idStyle.setQuotePrefixed(true);

   Sheet sheet = workbook.createSheet(); 

   for (int r = 0; r < data.length; r++) {
    Row row = sheet.createRow(r);
    for (int c = 0; c < data[0].length; c++) {
     Cell cell = row.createCell(c);

     if (r == 0) cell.setCellValue((String)data[r][c]); // the header row, all columns are strings

     if (r > 0 && c == 0) { // the ID column
      cell.setCellValue((String)data[r][c]);
      cell.setCellStyle(idStyle);
     } else if (r > 0 && c == 3) { // the number column
      cell.setCellValue((Double)data[r][c]);
      cell.setCellStyle(numberStyle);
     } else if (r > 0 && c == 4) { // the date column
      cell.setCellValue((GregorianCalendar)data[r][c]);
      cell.setCellStyle(dateStyle);
     } else if (r > 0) { // all other columns are strings
      cell.setCellValue((String)data[r][c]);
     }
    }
   }

   for (int c = 0; c < data[0].length; c++) {
    sheet.autoSizeColumn(c);
   }

   workbook.write(fileout);
  }
 }
}

代码使用apache poi 4.1.0进行测试。

【讨论】:

    【解决方案3】:

    您只需要在数据之前添加 = 符号。 例如:="00082"

    "=" + "\"0000882\""
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-25
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多