2013-06-05 93 views
21

私は、JavaでApache POIを使用してExcelファイルを作成しています。私はデータを入力してから、各列を自動サイズ調整しようとしますが、サイズは常に間違っています(そして、と一貫していると思います)。最初の2つの行は常に(?)完全に折りたたまれています。 Excelで列を自動サイズ設定すると、完全に機能します。Apache POI autoSizeColumnが正しくサイズ変更されない

空白のセルは書かれていません(私は信じています)、サイズ変更は最後です。

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上でプログラムを実行している:をそれはフォントの問題でした。私が見つけた唯一のフォントはSerifでした。

+1

これらの2つのQ&Aを確認しましたか? [1](http://stackoverflow.com/questions/11573993/setting-column-width-in-apache-poi/11574647)、[2](http://stackoverflow.com/questions/7412457/crash-when -calling-autosizecolumn-on-worksheet-run-under-linux-servicemix/12517025#12517025)...これはおそらく、使用されているフォントで何かをすることがあるでしょう – kiwiwings

+0

@kiwiwings私はWindowsにあるデフォルトのフォント(Calibri)ちょうど良い。私はフォントを他のものに変更して結果を投稿しようとしますが、フォントではないと思います。 – Jaws212

+1

'Serif'フォントを使ってみることができますか?私はこれがJavaが認識しているフォントに関連していると感じています。 – Shaded

答えて

12

私のコメントから答えを出してください。 this linkを使用しようとしていたフォントをJavaが認識していなかったので、新しいフォントをJavaにインストールして好きなものを使用できるようにするには役立ちます。 Javaが知っているデフォルトのフォントのリストもあります。

これは役に立ちました。これで問題は解決しました。

+1

私は本当にこれが起こるために何が変わったのか、私はなぜWindows 7の開発ボックスでしか見ていないのか不思議です。アルドの答えに対する私のコメントを見てください。 – theblang

+0

@mattblang説明についてはSebastienの答えをご覧ください。私たちはこの問題を開発ボックス(Windows)でのみ持っていましたが、インテグレーションマシン(Linux)ではそうではありませんでした。 – t0r0X

4

私は(私のJVMでサポートされています)Calibriフォントを使用したWindows 7の

に同様の問題がありました。そのフォントautoSizeColumn() POIの方法で使用されるjava.awt.font.TextLayoutgetBounds().getWidth()がCalibri、定期的にフォントを変更する0

を返すと は、私の場合には、問題を解決しました。

+0

私は最初にコードを書いたときに働いたCalibriも使用していました。私が考えることができる変更された唯一のものは、6から7までのJavaバージョンです。変わったことは、私たちのLinuxボックスはまだうまく動作しており、開発Windows 7環境だけが影響を受けているということです。 – theblang

+0

奇妙な、「Verdana」は、Linux製作用の箱ではうまく動作しません。私はあなたが言及したように 'Calibri-Regular'を使ってみるつもりです。 – theblang

+0

これは明らかに問題を解決しましたが、実際には、「Calibri-Regular」がインストールされていないため、「Arial」に置き換えられました。セバスチャンの答えは私の場合に解決策を提供しました。 – t0r0X

7

これはおそらくJava Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45に関連するthis POI Bugに関連しています。

この場合、フォントを変更するか、または6u45/7u21より上のJREを使用して問題を修正する必要があります。

私は私の中でデフォルトのフォント(ゴシックを使用していた - あなたはまた、問題をmtigitateと完全にここでは、この sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); }

+0

それは解決の答え、ありがとう! Calibriは現在のExcelバージョンのデフォルトのフォントであるため、JREのアップグレード、ダウングレード、またはパッチ適用は問題を解決します。 – t0r0X

+0

私の場合、列はsetColumnWidthの後でも崩壊したままです...典型的なMIN_WIDTHは何ですか? – golimar

2

のようなコードを使用することによって崩壊しているから列を回避することができ

は私の2セントですケース)を使用して、xls内の特定のフィールドを太字にします。 autoSizeColumn()関数と共にWindowsの魅力のように働いていました。

Linuxはそれほど寛容ではありませんでした。自動サイジングは場所によっては不適切でした。このスレッドと他のものを通過した後、私は次の解決策を考え出しました。

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

6

私もこの問題を抱えていましたが、これが私の解決策でした。

ステップ:

  1. ワークブック
  2. を作成
  3. スプレッドシートを作成します
  4. 行を作成します
  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

+0

実際には、コンテンツを書く前/後にフォントを追加すると、問題が解決します – sancho21

0

は、私が見つかりました。最も広い文字列が始まった時に十分な幅の列をしなかったこと、自動サイズ変更スペース、例えば

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

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

XSSFFont font = wb.createFont(); 
font.setFontName("Helvetica"); 
関連する問題