При записи в файл .csv значений BigDecimal, эксель потом отображает их как дату
При записи в файл .csv значений BigDecimal, эксель потом отображает их как дату, при открытии файла через EXCEL. А мне требуется, чтобы было отображено дробное число при открытии файла через EXCEL. Как это можно исправить.
Ответы (1 шт):
Для правильного отображения надо задать числовой формат ячейкам.
Пример с использованием 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.