JavaでExcelファイルを作成するためにApache POIを使用しています。データを入力し、各列を自動サイズ変更しようとしますが、サイズは常に間違っています(およびIthink一貫性)。最初の2行は常に完全に折りたたまれています(?)Excelで列のサイズを自動調整すると、完全に機能します。
空白のセルは書き込まれておらず(私は信じています)、サイズ変更は最後の私がしていることです。
関連するコードは次のとおりです。 これは、エラー処理などを行わないボイルダウンバージョンです。
public static synchronized String storeResults(ArrayList<String> resultList, String file) {
if (resultList == null || resultList.size() == 0) {
return file;
}
FileOutputStream stream = new FileOutputStream(file);
//Create workbook and result sheet
XSSFWorkbook book = new XSSFWorkbook();
Sheet results = book.createSheet("Results");
//Write results to workbook
for (int x = 0; x < resultList.size(); x++) {
String[] items = resultList.get(x).split(PRIM_DELIM);
Row row = results.createRow(x);
for (int i = 0; i < items.length; i++) {
row.createCell(i).setCellValue(items[i]);
}
}
//Auto size all the columns
for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) {
results.autoSizeColumn(x);
}
//Write the book and close the stream
book.write(stream);
stream.flush();
stream.close();
return file;
}
似たような質問がいくつかあることは知っていますが、それらのほとんどは、データを入力する前にサイジングする場合にすぎません。そして、そうでないいくつかはより複雑/未回答です。
編集:いくつかの異なるフォントを使用しようとしましたが、動作しませんでした。フォントが何であれ、すべての列を完全に折りたたむか、またはすべての列を折りたたむ必要があるため、これはそれほど驚くべきことではありません。
また、フォントの問題が発生したため、Windows 7でプログラムを実行しています。
解決しよう:これはフォントの問題でした。動作することがわかった唯一のフォントはセリフでした。
私のコメントから答えを出すためだけに。 Javaは使用しようとしているフォントを認識していないため、行のサイズを適切に設定できませんでした このリンク はJavaに新しいフォントをインストールする場合に役立ちます_ので、あなたはもっと凝ったものを使うことができます。 Javaが知っているデフォルトのフォントのリストもあります。
これが助けてくれて、あなたは問題を解決してくれました!
これはおそらく このPOIバグ に関連しており、これは JavaバグJDK-8013716:CalibriおよびCambriaフォントのレンダラーが更新45以降に失敗する に関連しています。
この場合、フォントを変更するか、6u45/7u21より上のJREを使用すると、問題が修正されます。
次のようなコードを使用して、問題を軽減し、列が完全に折りたたまれないようにすることもできます。
sheet.autoSizeColumn(x);
if (sheet.getColumnWidth(x) == 0) {
// autosize failed use MIN_WIDTH
sheet.setColumnWidth(x, MIN_WIDTH);
}
私もこの問題に直面していましたが、これが私の解決策でした。
手順:
コード:
// initialize objects
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet(sheetName);
XSSFRow row = spreadsheet.createRow(0);
XSSFCell cell;
// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);
// auto size
spreadsheet.autoSizeColumn(0);
// create file
File aFile = new File("Your Filename");
FileOutputStream out = new FileOutputStream(aFile);
workbook.write(out);
リソース:
私は、Arialフォントを置き換えようとしてHelveticaフォントを使用しました(実際、HelveticaはArialに似ています)。
XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
ここに私の2セントがあります-
デフォルトのフォント(私の場合はArial)を使用して、xlsの特定のフィールドを太字にしました。 autoSizeColumn()関数とともにWindowsのチャームのように機能しました。
Linuxはそれほど寛容ではありませんでした。自動サイジングは場所で不適切でした。このスレッドと他のスレッドを経て、次の解決策を思いつきました。
Arialフォントの.tffファイルをJava/jre/lib/fontsディレクトリにコピーし、アプリケーションを再実行しました。うまくいきました。
最も幅の広い文字列がスペースで始まる場合、自動サイズ変更では列の幅が十分に取れないことがわかりました。
cell.setCellValue(" New Cell");
これは、代わりにインデントを使用することで修正できます。
// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
style.setIndention((short)2);
// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);
// auto size
spreadsheet.autoSizeColumn(0);
次は私のために働く。
フォントを設定し、すべてのデータを入力した後にautoSizeColumn()を使用します。
public static XSSFWorkbook createExcel(List<ChannelVodFileInfoList> resList) {
XSSFWorkbook hwb = new XSSFWorkbook();
String[] title = { "1", "2", "3", "4"};
XSSFSheet sheet = hwb.createSheet("dataStats");
XSSFRow firstrow = sheet.createRow(0);
for (int i = 0; i < title.length; i++) {
XSSFCell xh = firstrow.createCell(i);
xh.setCellValue(title[i]);
}
if (resList == null || resList.size() == 0) {
return hwb;
}
for (int i = 0; i < resList.size(); i++) {
ChannelVodFileInfoList doTemp = resList.get(i);
XSSFRow row = sheet.createRow(i + 1);
for (int j = 0; j < title.length; j++) {
XSSFCell cell = row.createCell(j);
Font font111 = hwb.createFont();
font111.setBoldweight(Font.BOLDWEIGHT_NORMAL);
XSSFCellStyle cellStyle111 = hwb.createCellStyle();
cellStyle111.setFont(font111);
cell.setCellStyle(cellStyle111);
if (j == 0) {
cell.setCellValue(dateStr);
} else if (j == 1) {
cell.setCellValue(doTemp.getChannelName());
}else if (j == 2) {
cell.setCellValue(doTemp.getBitrate());
}else if (j == 3) {
cell.setCellValue(doTemp.getWh());
}
}
for (int j = 0; j < title.length; j++) {
sheet.autoSizeColumn(j);
}
return hwb;
}