POI. Как установить значение ячейки в Date и применить формат даты по умолчанию Excel?

Я использую Apache POI некоторое время, чтобы читать существующие файлы Excel 2003 программно. Теперь у меня появилось новое требование создать целые файлы .xls в памяти (все еще использующие Apache POI), а затем записать их в файл в конце. Единственная проблема, стоящая на моем пути, - это обработка ячеек с датами.

Рассмотрим следующий код:

Date myDate = new Date();
HSSFCell myCell;
// code that assigns a cell from an HSSFSheet to 'myCell' would go here...
myCell.setCellValue(myDate);

Когда я пишу книгу, содержащую эту ячейку, в файл и открываю ее в Excel, ячейка отображается как число. Да, я понимаю, что Excel сохраняет свои "даты" как количество дней с 1 января 1900 года, и это то, что число в ячейке представляет.

ВОПРОС: Какие вызовы API я могу использовать в POI, чтобы сказать, что я хочу, чтобы формат даты по умолчанию применялся к моей ячейке даты?

В идеале я хочу, чтобы ячейка электронной таблицы отображалась с тем же самым форматом даты по умолчанию, который Excel назначил бы ему, если бы пользователь вручную открыл электронную таблицу в Excel и набрал значение ячейки, которое Excel признал как дату.

Ответ 1

http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells

CellStyle cellStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(
    createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);

Ответ 2

Этот пример предназначен для работы с файлами типа .xlsx. Этот пример представлен на странице .jsp, используемой для создания электронной таблицы .xslx.

import org.apache.poi.xssf.usermodel.*; //import needed

XSSFWorkbook  wb = new XSSFWorkbook ();  // Create workbook
XSSFSheet sheet = wb.createSheet();      // Create spreadsheet in workbook
XSSFRow row = sheet.createRow(rowIndex); // Create the row in the spreadsheet


//1. Create the date cell style
XSSFCreationHelper createHelper = wb.getCreationHelper();
XSSFCellStyle cellStyle         = wb.createCellStyle();
cellStyle.setDataFormat(
createHelper.createDataFormat().getFormat("MMMM dd, yyyy")); 

//2. Apply the Date cell style to a cell

//This example sets the first cell in the row using the date cell style
cell = row.createCell(0);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);

Ответ 3

Чтобы установить значение по умолчанию Тип Excel Date (по умолчанию для OS level locale/- > ie xlsx будет выглядеть по-разному при открытии немецким или британским лицом/и помечен звездочкой, если вы выберете его в выборе формата ячейки Excel), вы должны

    CellStyle cellStyle = xssfWorkbook.createCellStyle();
    cellStyle.setDataFormat((short)14);
    cell.setCellStyle(cellStyle);

Я сделал это с xlsx, и он работал нормально.

Ответ 4

Я пишу свой ответ здесь, потому что он может быть полезен другим читателям, у которых может быть немного другое требование, чем вопросник здесь.

Я готовлю шаблон .xlsx; все ячейки, которые будут заполнены датами, уже отформатированы как ячейки даты (с использованием Excel).

Я открываю шаблон .xlsx с помощью Apache POI, а затем просто записываю дату в ячейку, и она работает.

В приведенном ниже примере ячейка A1 уже отформатирована из Excel с форматом [$-409]mmm yyyy, а код Java используется только для заполнения ячейки.

FileInputStream inputStream = new FileInputStream(new File("Path to .xlsx template"));
Workbook wb = new XSSFWorkbook(inputStream);
Date date1=new Date();
Sheet xlsMainTable = (Sheet) wb.getSheetAt(0);
Row myRow= CellUtil.getRow(0, xlsMainTable);
CellUtil.getCell(myRow, 0).setCellValue(date1);

Когда открывается Excel, дата отформатирована правильно.

Ответ 5

Этот образец кода может использоваться для изменения формата даты. Здесь я хочу перейти от yyyy-MM-dd к dd-MM-yyyy. Здесь pos находится позиция столбца.

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class Test{ 
public static void main( String[] args )
{
String input="D:\\somefolder\\somefile.xlsx";
String output="D:\\somefolder\\someoutfile.xlsx"
FileInputStream file = new FileInputStream(new File(input));
XSSFWorkbook workbook = new XSSFWorkbook(file);
XSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> iterator = sheet.iterator();
Cell cell = null;
Row row=null;
row=iterator.next();
int pos=5; // 5th column is date.
while(iterator.hasNext())
{
    row=iterator.next();

    cell=row.getCell(pos-1);
    //CellStyle cellStyle = wb.createCellStyle();
    XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle();
    CreationHelper createHelper = wb.getCreationHelper();
    cellStyle.setDataFormat(
        createHelper.createDataFormat().getFormat("dd-MM-yyyy"));
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date d=null;
    try {
        d= sdf.parse(cell.getStringCellValue());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        d=null;
        e.printStackTrace();
        continue;
    }
    cell.setCellValue(d);
    cell.setCellStyle(cellStyle);
   }

file.close();
FileOutputStream outFile =new FileOutputStream(new File(output));
workbook.write(outFile);
workbook.close();
outFile.close();
}}