Шаблон Apache-poi, ведущие нули исчезают при редактировании ячеек - PullRequest
0 голосов
/ 22 мая 2019

Я создаю шаблон .xlsx, используя apache-poi, пользователь должен вставить идентификатор фиксированной длины.

Я уже попробовал 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, новый идентификатор будет 0000011, и, к сожалению, идентификаторы не последовательные.

Спасибо за ваше время и простите меня за мой плохой английский XD

1 Ответ

0 голосов
/ 22 мая 2019

Невозможно воспроизвести вашу проблему.

Следующий код создает лист Excel с идентификаторами в столбце A, которые не теряют свой текстовый формат и начальные нули, даже если редактируется в 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 s GUI не будет использовать стиль текста при добавлении туда содержимого ячейки.

Мой код завершен, протестирован и работает для меня.Простое редактирование ячеек в Excel не может привести к потере части содержимого ячейки (ведущих нулей) из-за использования числового формата @ = Text.

Конечно, если кто-то изменит формат номера столбца с Text на General, тогда 0000111 будет числом 111 после редактирования.Но это не может быть предотвращено, когда лист редактируется пользователем.

Может быть, можно дополнительно установить CellStyle.setQuotePrefixed .Как:

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

Тогда весь контент будет дополняться префиксом цитаты апострофом ' дополнительно.Но это также может быть изменено пользователем, редактирующим лист.

...