При записи в файл .csv значений BigDecimal, эксель потом отображает их как дату

При записи в файл .csv значений BigDecimal, эксель потом отображает их как дату, при открытии файла через EXCEL. А мне требуется, чтобы было отображено дробное число при открытии файла через EXCEL. Как это можно исправить. введите сюда описание изображения


Ответы (1 шт):

Автор решения: Falchio

Для правильного отображения надо задать числовой формат ячейкам.

Пример с использованием Apache Poi - java библиотеки для работы с MS Office.

Для старта думаю хорошо подойдут эти ресурсы:

Для Maven проекта добавляем зависимость в pom.xml.

<dependency> 
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId> 
  <version>5.2.0</version> 
</dependency> 
<dependency> 
  <groupId>org.apache.poi</groupId> 
  <artifactId>poi-ooxml</artifactId> 
  <version>5.2.0</version> 
</dependency>

Пример записи в файл:

import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }
        }

        // Rows with rownum < 900 are flushed and not accessible
        for(int rownum = 0; rownum < 900; rownum++){
          Assert.assertNull(sh.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for(int rownum = 900; rownum < 1000; rownum++){
            Assert.assertNotNull(sh.getRow(rownum));
        }

        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    }

⚠️ Warning
Будьте только аккуратнее при выборе класса реализующего Workbook. Есть SXSSFWorkbook и XSSFWorkbook.
SXSSFWorkbook - потребляет мало памяти, но имеет доступ только к строкам, которые находятся в памяти.
XSSFWorkbook - имеет доступ ко всем документу сразу, но мало пригоден для больших документов.

Задать формат ячейки можно таким образом:

    final CreationHelper helper = workbook.getCreationHelper();
    final CellStyle style = workbook.createCellStyle();
    style.setDataFormat(helper.createDataFormat.getFormat("#,##0.00"));
    cell.setCellStyle(cellStyle);

Список форматов, хотя может воспринимать и форматы, которых нет в списке. Например, "dd.MM.yyyy".

Для перевода в формат .csv думаю можно воспользоваться этим ответом с основного stackoveflow.

→ Ссылка