ฉันจะตั้งค่าเซลล์เป็นวันที่และใช้รูปแบบวันที่เริ่มต้นของ Excel ได้อย่างไร


102

ฉันใช้ 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 รับรู้ว่าเป็นวันที่

คำตอบ:


174

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()วิธีการที่แสดงในตัวอย่างด้านบน
Jim Tough

ส่วนสำคัญอยู่ในความคิดเห็นของลิงก์: เราจัดรูปแบบเซลล์ที่สองเป็นวันที่ (และเวลา) สิ่งสำคัญคือต้องสร้างสไตล์เซลล์ใหม่จากเวิร์กบุ๊กมิฉะนั้นคุณสามารถปรับเปลี่ยนสไตล์ที่สร้างขึ้นและมีผลไม่เพียง แต่เซลล์นี้เท่านั้น แต่เซลล์อื่น ๆ
CGK

ขอบคุณ @ninja คุณรู้getCreationHelper()หรือไม่ว่าทำไมจึงจำเป็น? ตอนนี้ฉันกำลังทำงานกับ Mule เพื่อสร้างไฟล์เอาท์พุต Excel และฉันก็สามารถใช้สิ่งนี้ได้createDataFormat()โดยไม่ต้องมีผู้ช่วยสร้างและสร้างไฟล์ Excel ในการทดสอบของฉัน มีข้อเสียที่จะไม่ใช้หรือไม่? ขอบคุณ!
Rashiki

@Rashiki คำตอบนี้โพสต์เมื่อ 6 ปีที่แล้ว ฉันเดาว่า API ของ Apache POI มีการเปลี่ยนแปลงในช่วงเวลานี้ คำตอบของฉันสำหรับคำถามของคุณคือ 'ไม่ไม่มีข้อเสีย (ถ้าได้ผลตามที่คาดไว้)'
ninja

ฉันไม่เห็นรูปแบบใด ๆ สำหรับmm/dd/yyyy. เมื่อฉันใช้รูปแบบอื่น excel จะแสดงข้อผิดพลาดFile error, some number formats may have been lostมันจะแสดงDateประเภทใน excel ฉันไม่รู้ว่าจะแก้ไขได้อย่างไร
Akash

24

หากต้องการตั้งค่าเป็นค่าเริ่มต้นของ Excel ให้พิมพ์วันที่ (ค่าเริ่มต้นเป็นตำแหน่งที่ตั้งระดับ OS / -> เช่น xlsx จะดูแตกต่างออกไปเมื่อเปิดโดยคนเยอรมันหรืออังกฤษ / และติดธงด้วยเครื่องหมายดอกจันหากคุณเลือกในตัวเลือกรูปแบบเซลล์ของ Excel) คุณควร:

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

ฉันใช้ xlsx และมันก็ใช้ได้ดี


2
เห็นด้วยอย่างยิ่งกับความคิดเห็นของ fiffy ฉันมีคำถามเดียว แนวทางที่ดีที่สุดคืออะไร อาศัยค่า dataFormat short (14) หรือค่าสตริง ("m / d / yy") ค่าคงที่ซึ่งอธิบายรูปแบบวันที่มาตรฐานใน Excel คืออะไร? DataFormat.getFormat () มีทั้งแบบสตริงและแบบสั้นเป็นพารามิเตอร์
Miklos Krivan

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 โดยใช้ 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 วันที่จะถูกจัดรูปแบบอย่างถูกต้อง


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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.