setDataFormat в SXSSF, Apache POI

390
19 августа 2017, 00:37

Создал .xlsx файл, в который записываются данные большого объема с БД с помощью SXSSFWorkbook. Не получается форматирование текста в ячейках. Код такой:

SXSSFWorkbook workbook = new SXSSFWorkbook(100);
SXSSFSheet excelSheet = workbook.createSheet(file_name);
SXSSFCreationHelper creationHelper = (SXSSFCreationHelper) workbook.getCreationHelper();
//XSSFCellStyle style_for_numbers = (XSSFCellStyle) workbook.createCellStyle();
CellStyle style_for_numbers = workbook.createCellStyle();
style_for_numbers.setBorderBottom(BorderStyle.THIN);
style_for_numbers.setBorderLeft(BorderStyle.THIN);
style_for_numbers.setBorderRight(BorderStyle.THIN);
style_for_numbers.setBorderTop(BorderStyle.THIN);
//DataFormat format = workbook.createDataFormat();
//style_for_numbers.setDataFormat(format.getFormat("$#,##0.00"));
style_for_numbers.setDataFormat(creationHelper.createDataFormat().getFormat("#,##0.00"));
......
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery(sqlQuery0);
......
while (rs.next()) {
SXSSFRow row1 = excelSheet.createRow(row_num);
for (int i = 1; i <= col_cnt; i++) {
SXSSFCell cell = row1.createCell(i-1);
cell.setCellValue(rs.getString(i) == null ? "" : rs.getString(i) );
cell.setCellStyle(style_for_numbers);
}
}

Границы ячеек отображаются, форматирование значений ячеек не происходит. Пробовал и с DataFormat и с SXSSFCreationHelper, менял SXSSF на XSSF, ничего не помогает. Здесь нашел нечто похожее: https://bz.apache.org/bugzilla/show_bug.cgi?id=54479, но у меня стиль ячеек создается за пределами цикла.... Помогите, пожалуйста, разобраться.

Answer 1

Олег,

Попробуйте использовать следующий вариант:

DataFormat dataFormat = wb.createDataFormat();
style_for_numbers.setDataFormat(dataFormat.getFormat("#,##0.00"));

Маленький псевдокод, который трансформировал из Вашего кода:

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class SXSSFTest {
    public static void main(String[] args) throws IOException {
        SXSSFWorkbook wb = new SXSSFWorkbook();
        FileOutputStream fileOut = new FileOutputStream("D:\\SXSSF.xlsx");
        SXSSFSheet excelSheet = wb.createSheet("Test Sheet");
        CellStyle style_for_numbers = wb.createCellStyle();
        style_for_numbers.setBorderBottom(BorderStyle.THIN);
        style_for_numbers.setBorderLeft(BorderStyle.THIN);
        style_for_numbers.setBorderRight(BorderStyle.THIN);
        style_for_numbers.setBorderTop(BorderStyle.THIN);
        DataFormat dataFormat = wb.createDataFormat();
        style_for_numbers.setDataFormat(dataFormat.getFormat("#,##0.00"));
        SXSSFRow row1 = excelSheet.createRow(2);
        for (int i = 1; i <= 2; i++) {
            SXSSFCell cell = row1.createCell(i);
            cell.setCellValue(12312312);
            cell.setCellStyle(style_for_numbers);
        }
        wb.write(fileOut);
        fileOut.close();
    }
}

Результат выполнения выглядит так:

И еще один вариант, который по сути форматирует само значение, а не ставит стиль для всей ячейки (но это так... побаловаться):

cell.setCellValue(new CellNumberFormatter("#,##0.00").format(12312312));

Надеюсь поможет решить Вашу проблему.

Answer 2

Код переделанный из того, что Вы сбрасывали выше:

import org.apache.poi.ss.format.CellNumberFormatter;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class datafrm {
    public static void main(String[] args) throws IOException {
        SXSSFWorkbook wb = new SXSSFWorkbook();
        FileOutputStream fileOut = new FileOutputStream("C:\\SXSSF.xlsx");
        SXSSFSheet excelSheet = wb.createSheet("Test Sheet");
        CellStyle style_for_numbers = wb.createCellStyle();
        style_for_numbers.setBorderBottom(BorderStyle.THIN);
        style_for_numbers.setBorderLeft(BorderStyle.THIN);
        style_for_numbers.setBorderRight(BorderStyle.THIN);
        style_for_numbers.setBorderTop(BorderStyle.THIN);
        SXSSFRow row1 = excelSheet.createRow(2);
        for (int i = 1; i <= 2; i++) {
            SXSSFCell cell = row1.createCell(i);
            System.out.println(Double.parseDouble("1234567.89"));
            //cell.setCellValue(new CellNumberFormatter("#,##0.00").format(1234567.89));
            //cell.setCellValue(1234567.89);
            cell.setCellValue(new CellNumberFormatter("#,##0.00").format(Double.parseDouble("1234567.89")));
        }
        wb.write(fileOut);
        fileOut.close();
        wb.close();
    }
}

Если я использую cell.setCellValue(new CellNumberFormatter("#,##0.00").format(Double.parseDouble("1234567.89"))); или cell.setCellValue(new CellNumberFormatter("#,##0.00").format(1234567.89)); то записывается "1,234,567,,89.12" Почему так происходит форматирование, пока непонятно.

READ ALSO
java.lang.UnsatisfiedLinkError: Can&#39;t find dependent libraries - iostream

java.lang.UnsatisfiedLinkError: Can't find dependent libraries - iostream

Продолжая исследовать JNI столкнулся с таким моментом: в файлах в которых я описываю реализацию методов(cpp), при подключении iostream после сборки...

337
Navigation Drawer в нескольких активити

Navigation Drawer в нескольких активити

ЗдравствуйтеЕсть код, он дает возможность открывать левую шторку и добавляет гамбургер

320
WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

WebDav и libreoffice 5.3.4 не приходит PUT запрос от libreoffice

Есть связка приложение на java,spring, реализовываю функционал позволяющий из приложения по клику на ссылку документа(

236