셀 값을 날짜로 설정하고 기본 Excel 날짜 형식을 적용하려면 어떻게합니까?


101

저는 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에서 할당 한 것과 동일한 기본 날짜 형식으로 스프레드 시트 셀이 표시되기를 원합니다.

답변:


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
고마워 닌자, 이것은 나를 위해 작동합니다. 이 작업을 수행해야하는 다른 사용자를위한 하나의 댓글입니다. BuiltinFormatsExcel에서 알고있는 모든 표준 형식 (날짜 형식뿐 아니라)을 나열 하는 POI 클래스 가 있습니다. getFormat()위의 스 니펫에 표시된 방법 에 대한 매개 변수로 사용할 매개 변수 중 하나를 고수하고 있습니다.
Jim Tough

중요한 부분은 링크의 주석에 있습니다. 두 번째 셀을 날짜 (및 시간)로 스타일링합니다. 통합 문서에서 새 셀 스타일을 만드는 것이 중요합니다. 그렇지 않으면 기본 제공 스타일을 수정하고이 셀뿐만 아니라 다른 셀에도 영향을 미칠 수 있습니다.
CGK 2013 년

감사합니다, @ninja. 왜 getCreationHelper()필요한지 아십니까? 저는 지금 Mule과 함께 Excel 출력 파일을 생성하고 있으며 실제로 createDataFormat()생성 도우미없이 를 사용할 수 있었고 테스트에서 Excel 파일을 생성했습니다. 그것을 사용하지 않는 단점이 있습니까? 감사!
Rashiki

@Rashiki이 답변은 6 년 전에 게시되었습니다. 이 기간 동안 Apache POI의 API가 변경된 것 같습니다. 귀하의 질문에 대한 제 대답은 '아니요, 단점이 없습니다 (예상대로 작동하는 경우)'입니다
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 짧은 값 (14) 또는 문자열 값 ( "m / d / yy")을 사용합니다. Excel의 표준 날짜 형식을 설명하는 상수 값은 무엇입니까? DataFormat.getFormat ()에는 매개 변수로 문자열과 짧은 값이 모두 있습니다.
Miklos Krivan

Miklos, 문자열 값 솔루션이 어떻게 작동하는지 모르겠습니다. 다른 언어로 Excel에서 "언어 기반의 다른 기본 날짜 형식"도 표시되는지 여부를 피드백 할 수 있다면 기쁠 것입니다.
BlondCode

13

이 예제는 .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);

1

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

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


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.