저는 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 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을 열면 날짜 형식이 올바르게 지정됩니다.
답변
이 코드 샘플은 날짜 형식을 변경하는 데 사용할 수 있습니다. 여기에서 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);