मैं दिनांक और डिफ़ॉल्ट एक्सेल तिथि प्रारूप को लागू करने के लिए सेल मान कैसे सेट करूं?


101

मैं कुछ समय के लिए अपाचे POI का उपयोग कर रहा हूँ मौजूदा Excel 2003 फ़ाइलों को प्रोग्रामेटिक रूप से पढ़ने के लिए। अब मुझे संपूर्ण .xls फ़ाइलें इन-मेमोरी (अभी भी अपाचे POI का उपयोग करके) बनाने के लिए एक नई आवश्यकता है और फिर उन्हें अंत में एक फ़ाइल में लिखें। मेरे रास्ते में खड़ी होने वाली एकमात्र समस्या तारीखों के साथ कोशिकाओं की हैंडलिंग है।

निम्नलिखित कोड पर विचार करें:

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

जब मैं इस सेल वाले वर्कबुक को फाइल में लिखता हूं और इसे एक्सेल के साथ खोलता हूं, तो सेल एक नंबर के रूप में प्रदर्शित होता है। हां, मुझे एहसास है कि एक्सेल 1 जनवरी 1900 से दिनों की संख्या के रूप में अपनी 'तारीखों' को संग्रहीत करता है और सेल में संख्या का प्रतिनिधित्व करता है।

प्रश्न: मैं यह बताने के लिए कि मैं अपनी तिथि सेल पर लागू एक डिफ़ॉल्ट तिथि प्रारूप चाहता हूं, यह बताने के लिए मैं पीओआई में किस एपीआई कॉल का उपयोग कर सकता हूं?

आदर्श रूप से मैं चाहता हूं कि स्प्रेडशीट सेल को उसी डिफ़ॉल्ट तिथि प्रारूप के साथ प्रदर्शित किया जाए जो एक्सेल ने इसे सौंपा होगा यदि किसी उपयोगकर्ता ने एक्सेल में मैन्युअल रूप से स्प्रेडशीट को खोला था और एक सेल मूल्य में टाइप किया था जिसे एक्सेल ने तारीख के रूप में मान्यता दी थी।

जवाबों:


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एक्सेल को पता है कि सभी मानक प्रारूपों (न सिर्फ तारीख स्वरूपों) को सूचीबद्ध करता है। मैं getFormat()ऊपर के स्निपेट में दिखाए गए विधि के लिए मेरे पैरामीटर के रूप में उपयोग करने के लिए उनमें से एक के साथ चिपका रहा हूं ।
जिम टफ

महत्वपूर्ण हिस्सा लिंक की टिप्पणियों में है: हम दूसरी सेल को दिनांक (और समय) के रूप में शैली देते हैं। कार्यपुस्तिका से एक नई सेल शैली बनाना महत्वपूर्ण है अन्यथा आप अंत में निर्मित शैली को संशोधित कर सकते हैं और न केवल इस सेल को बल्कि अन्य कोशिकाओं को भी प्रभावित कर सकते हैं।
CGK

धन्यवाद, @ निंजा क्या आप जानते हैं कि getCreationHelper()इसकी आवश्यकता क्यों है? मैं एक्सेल आउटपुट फाइल बनाने के लिए अभी Mule के साथ काम कर रहा हूं और मैं वास्तव createDataFormat()में क्रिएशन हेल्पर के बिना उपयोग करने में सक्षम था और अपने टेस्ट में एक्सेल फाइल जेनरेट करता था। क्या इसका उपयोग नहीं करने के लिए एक नकारात्मक पहलू है? धन्यवाद!
राशिकी

@Rashiki यह जवाब 6 साल पहले पोस्ट किया गया था। मुझे लगता है कि इस दौरान Apache POI का API बदल गया है। आपके प्रश्न का मेरा उत्तर है 'नहीं, कोई नकारात्मक पहलू नहीं है (यदि यह अपेक्षा के अनुरूप काम करता है)'
निंजा

मैं किसी भी प्रारूप के लिए नहीं देखता हूं mm/dd/yyyy। जब मैं किसी अन्य प्रारूप का उपयोग करता हूं, तो एक्सेल एक त्रुटि प्रदर्शित करता है File error, some number formats may have been lost, यह Dateएक्सेल में डिस्प्ले टाइप करता है । मेरे पास कोई सुराग नहीं है कि यह कैसे तय किया जा सकता है।
आकाश

24

डिफ़ॉल्ट प्रकार पर सेट करने के लिए तिथि टाइप करें (OS स्तर लोकेल पर डिफ़ॉल्ट / -> यानी जर्मन या ब्रिटिश व्यक्ति द्वारा खोले जाने पर xlsx अलग दिखाई देगा / और यदि आप इसे Excel के सेल प्रारूप चयनकर्ता में चुनते हैं तो तारांकन चिह्न के साथ ध्वजांकित होना चाहिए)

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

मैंने इसे xlsx के साथ किया और इसने ठीक काम किया।


2
फिफ्टी की टिप्पणी पर बिल्कुल सहमत थे। मेरा एक ही सवाल है। सबसे अच्छा तरीका क्या है। डेटाफ़ॉर्मैट शॉर्ट वैल्यू (14) या स्ट्रिंग वैल्यू ("m / d / yy") पर भरोसा करें। एक्सेल में मानक तिथि प्रारूप का वर्णन करने वाला वास्तव में निरंतर मूल्य कौन सा है? DataFormat.getFormat () में स्ट्रिंग के साथ और पैरामीटर के रूप में लघु मान दोनों होते हैं।
मिकलोस क्रिवन

मिक्लोस, मुझे नहीं पता कि स्ट्रिंग मूल्य समाधान कैसे काम करता है। मुझे खुशी होगी कि अगर कोई यह प्रतिक्रिया दे सकता है कि क्या विभिन्न भाषाओं के साथ एक्सेल में "भाषा आधारित अलग डिफ़ॉल्ट तिथि प्रारूप" भी दिखाई दे रहा है या नहीं।
ब्लॉन्डकोड

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 टेम्पलेट तैयार करता हूं; वे सभी कोशिकाएँ जो तारीखों से आबाद होंगी, पहले से ही तारीख कोशिकाओं (एक्सेल का उपयोग करके) के रूप में स्वरूपित हैं।

मैं Apache POI का उपयोग करके .xlsx टेम्प्लेट को खोलता हूं और फिर सेल को दिनांक लिखता हूं, और यह काम करता है।

नीचे दिए गए उदाहरण में, सेल A1 को पहले से ही प्रारूप के साथ एक्सेल के भीतर से स्वरूपित किया गया है [$-409]mmm yyyy, और जावा कोड का उपयोग केवल सेल को पॉप्युलेट करने के लिए किया जाता है।

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

जब एक्सेल खोला जाता है, तो तारीख को सही ढंग से स्वरूपित किया जाता है।


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

एक्सेल द्वारा उपयोग किए गए प्रारूप स्ट्रिंग को जानने के लिए यह अनुमान लगाने के लिए: एक एक्सेल फ़ाइल बनाएं, सेल 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.