[java] 셀 값을 날짜로 설정하고 기본 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은 1900 년 1 월 1 일 이후의 일 수로 ‘날짜’를 저장하고 셀의 숫자가 나타내는 것임을 알고 있습니다.

질문 : POI에서 내 날짜 셀에 적용되는 기본 날짜 형식을 원한다는 것을 알리기 위해 어떤 API 호출을 사용할 수 있습니까?

이상적으로는 사용자가 Excel에서 스프레드 시트를 수동으로 열고 Excel에서 날짜로 인식 한 셀 값을 입력 한 경우 Excel에서 할당 한 것과 동일한 기본 날짜 형식으로 스프레드 시트 셀이 표시되기를 원합니다.



답변

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


답변

기본 Excel 유형 날짜로 설정하려면 (기본값은 OS 수준 로케일 /-> 즉, xlsx는 독일 또는 영국 사람이 열 때 다르게 표시되고 / Excel의 셀 형식 선택기에서 선택한 경우 별표로 표시됨) 다음을 수행해야합니다.

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

xlsx로 해냈고 잘 작동했습니다.


답변

이 예제는 .xlsx 파일 형식 작업을위한 것입니다. 이 예제는 .xslx 스프레드 시트를 만드는 데 사용 된 .jsp 페이지에서 가져온 것입니다.

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


답변

여기에 질문자와 약간 다른 요구 사항을 가진 다른 독자에게 도움이 될 수 있기 때문에 여기에 답변을 작성하고 있습니다.

.xlsx 템플릿을 준비합니다. 날짜로 채워질 모든 셀은 이미 날짜 셀로 형식이 지정되어 있습니다 (Excel 사용).

Apache POI를 사용하여 .xlsx 템플릿을 연 다음 셀에 날짜를 쓰면 작동합니다.

아래 예에서 A1 셀은 이미 Excel 내에서 형식으로 지정되었으며 [$-409]mmm yyyyJava 코드는 셀을 채우는 데만 사용됩니다.

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을 열면 날짜 형식이 올바르게 지정됩니다.


답변

이 코드 샘플은 날짜 형식을 변경하는 데 사용할 수 있습니다. 여기에서 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();
}}


답변

추측 할 필요없이 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);


답변