web-dev-qa-db-ja.com

Apache POI autoSizeColumnのサイズが正しくない

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でプログラムを実行しています。

解決しよう:これはフォントの問題でした。動作することがわかった唯一のフォントはセリフでした。

25
Jaws212

私のコメントから答えを出すためだけに。 Javaは使用しようとしているフォントを認識していないため、行のサイズを適切に設定できませんでした このリンク はJavaに新しいフォントをインストールする場合に役立ちます_ので、あなたはもっと凝ったものを使うことができます。 Javaが知っているデフォルトのフォントのリストもあります。

これが助けてくれて、あなたは問題を解決してくれました!

13
Shaded

これはおそらく この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);
    }
7
Sebastien

私もこの問題に直面していましたが、これが私の解決策でした。

手順:

  1. ブックを作成する
  2. スプレッドシートを作成する
  3. 行を作成
  4. フォントを「Arial」に作成/設定します
  5. フォントでスタイルを作成/設定
  6. 値とスタイルでセルを作成/設定
  7. autoSizeColumn
  8. ファイルを作成

コード:

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

リソース:

http://www.tutorialspoint.com/Apache_poi/index.htm

6
Stosh15

私は、Arialフォントを置き換えようとしてHelveticaフォントを使用しました(実際、HelveticaはArialに似ています)。

XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
2

ここに私の2セントがあります-

デフォルトのフォント(私の場合はArial)を使用して、xlsの特定のフィールドを太字にしました。 autoSizeColumn()関数とともにWindowsのチャームのように機能しました。

Linuxはそれほど寛容ではありませんでした。自動サイジングは場所で不適切でした。このスレッドと他のスレッドを経て、次の解決策を思いつきました。

Arialフォントの.tffファイルをJava/jre/lib/fontsディレクトリにコピーし、アプリケーションを再実行しました。うまくいきました。

2
davyjones

最も幅の広い文字列がスペースで始まる場合、自動サイズ変更では列の幅が十分に取れないことがわかりました。

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);
1
Heather Turner

次は私のために働く。

フォントを設定し、すべてのデータを入力した後に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;
}
0
Vicky