Создал .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, но у меня стиль ячеек создается за пределами цикла.... Помогите, пожалуйста, разобраться.
Олег,
Попробуйте использовать следующий вариант:
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));
Надеюсь поможет решить Вашу проблему.
Код переделанный из того, что Вы сбрасывали выше:
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" Почему так происходит форматирование, пока непонятно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей