Як встановити значення клітинки "Дата" та застосувати стандартний формат дати Excel?


101

Я деякий час використовую POI Apache для програмного читання існуючих файлів Excel 2003. Тепер у мене є нова вимога створити цілі файли .xls у пам'яті (все ще використовуючи POI Apache), а потім записати їх у файл наприкінці. Єдина проблема, яка мені перешкоджає, - це обробка осередків з датами.

Розглянемо наступний код:

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 визнав датою.

Відповіді:


172

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);

21
Дякую ніндзя, це працює для мене. Один коментар для інших, кому це потрібно зробити. Існує клас POI з назвою, BuiltinFormatsякий перераховує всі стандартні формати (не лише формати дати), які знає Excel. Я дотримуюся одного з тих, які використовуватимуть як мій параметр getFormat()методу, показаному в фрагменті вище.
Джим Крутий

Важлива частина - у коментарях посилання: ми друкуємо другу клітинку як дату (і час). Важливо створити новий стиль комірки з робочої книги, інакше ви можете змінити вбудований стиль і вплинути не тільки на цю клітинку, але й на інші комірки.
CGK

Дякую, @ninja. Ви знаєте, навіщо getCreationHelper()це потрібно? Зараз я працюю з Mule, щоб генерувати вихідний файл Excel, і я фактично зміг використовувати createDataFormat()помічник без створення і створив файл Excel у своєму тесті. Чи є недолік його не використовувати? Дякую!
Рашики

@Rashiki Ця відповідь була опублікована 6 років тому. Я думаю, що API POI Apache змінився за цей час. Моя відповідь на ваше запитання: "Ні, немає зворотного боку (якщо він працює, як очікувалося)"
ніндзя,

Я не бачу жодного формату для mm/dd/yyyy. Коли я використовую будь-який інший формат, excel відображає помилку File error, some number formats may have been lost, він відображає Dateтип excel. У мене немає поняття, як це можна виправити.
акаш

24

Для встановлення типової дати Excel за замовчуванням (за замовчуванням на рівні локальної системи / -> тобто xlsx буде виглядати інакше, коли його відкриє німецька чи британська особа / та позначено зірочкою, якщо ви виберете його у виборі формату комірок Excel), слід:

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

Я робив це за допомогою xlsx, і він працював чудово.


2
Абсолютно погодився з коментарем fiffy. У мене є лише одне питання. Який найкращий підхід. Покладайтеся на коротке значення dataFormat (14) або на рядок ("m / d / yy"). Яке дійсно є постійним значенням, яке описує стандартний формат дати в Excel? DataFormat.getFormat () має параметр як із рядком, так і з коротким значенням.
Міклош Криван

Miklos, я не знаю, як працює рішення значення струни. Буду радий, якщо хтось може відповісти, чи це також відображає "мовний інший формат дати за замовчуванням" в програмах Excels з різними мовами.
BlondCode

13

Цей приклад призначений для роботи з .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);

1

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

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

Я відкриваю шаблон .xlsx за допомогою POI Apache, а потім просто записую дату в комірку, і вона працює.

У наведеному нижче прикладі комірка 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, дата форматується правильно.


0

Цей зразок коду можна використовувати для зміни формату дати. Тут я хочу перейти від 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();
}}

0

Щоб знати рядок формату, який використовує Excel, не потребуючи його здогадуватися: створіть файл excel, напишіть дату в комірку A1 і відформатуйте її так, як вам потрібно. Потім запустіть наступні рядки:

FileInputStream fileIn = new FileInputStream("test.xlsx");
Workbook workbook = WorkbookFactory.create(fileIn);
CellStyle cellStyle = workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
String styleString = cellStyle.getDataFormatString();
System.out.println(styleString);

Потім скопіюйте вставлений рядок, видаліть зворотні косої риски (наприклад, d/m/yy\ h\.mm;@стає d/m/yy h.mm;@) та використовуйте її в http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells код:

CellStyle cellStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("d/m/yy h.mm;@"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.