Apache POI Excel-列を展開するように構成するにはどうすればよいですか?


98

一部のデータを出力Apache POI APIするexcel spreadsheetために生成に使用しています。

私が直面している問題は、スプレッドシートを作成して開いたときに列が展開されないため、日付形式のテキストなどの長いテキストが一見して表示されないことです。

Excelで列の境界線をダブルクリックして展開するか、境界線をドラッグして列の幅を調整するだけですが、20列以上ある可能性があり、スプレッドシートを開くたびに手動で実行する方法はありません:(

私は(間違った方法groupRow()であるsetColumnGroupCollapsed()かもしれませんが)知っていて、トリックを行うことができるかもしれませんが運がありません。多分私はそれを間違った方法で使用しています。

サンプルコードスニペット

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

このスプレッドシートを作成すると、「最初に表示しないテキスト」という文字列がセル内にありますが、列が展開されていないため、「Loooooooo」のみが表示されています。

スプレッドシートを開いたときに列が既に展開されているように構成するにはどうすればよいですか?



POIを使用してこれを実現する方法を探しているようです。ただし、Excelで簡単に行うには、シート全体を選択し、AB列見出しの境界をダブルクリックします。これを複数のシートで行う必要がある場合は、コード化されたソリューションの方が役立つ場合があります。
2014

回答:


172

後はあなたがシートにすべてのデータを追加した、あなたが呼び出すことができautoSizeColumn(int column)、適切なサイズに列を自動調整するために、あなたのシートに

APIへのリンクは次のとおりです。

以上の基準については、この記事を参照してください ApacheのPOIを使用した場合、コンテンツのサイズにExcelのセルのサイズをフィッティングに問題を


7
それautoSizeColumnがうまくスケーリングせず、多くの行がある場合は非常に遅くなることを指摘したかっただけです。私は少しハックして、この質問で提案されたものと同様のことをしなければなりませんでした。
lbstr 2014

8
autoSizeColumn に関する警告。これには、Javaフォントが使用可能である必要があります。これはサーバーで使用されるヘッドレスJava jreの一部ではなく、NullPointerExceptionをスローします。
スティーブンディロン

@StephenDillonフォント構成のnullポインタを修正する方法はありますか?
Veeshal

私たちが見つけた最良の方法は、colの各行をループして、最も長いcharの長さを見つけ、x +を掛けてバッファーを追加することでした。Xは試行錯誤して何が収まるかを確認しますが、charの平均的な幅でなければなりません。フォントがなければ私はあなたが実際にそれを正しく得ることができるとは信じていませんが、私たちはかなり近づきます。それ以外の場合は、ユーザーが初めてマクロを開くときにExcelにマクロを追加して修正することができます。これは最善の方法ですが、マクロを有効にする必要があります
Stephen Dillon

45

ヒント:自動サイズの作品を作るために、呼び出しがするsheet.autoSizeColumn(columnNumber)なされるべきである後に Excelにデータを取り込みます。

データを入力する前にメソッドを呼び出しても効果はありません。


stackoverflow.com/questions/37069820/…うまくいかない場合がある
user7856586

ここで提供される回答はJavaに関連していますが、コメントで提供されるリンクはAndroidに関連しています。答えはすべてのJavaケースでまだ機能します(Javaフォントを利用できないヘッドレスJava JREを除く)。
Unni Kris

おかげで、私はfuncを計算し、次のようにsetColumnWidthを使用しました。– user7856586 (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
15:03

@ user7856586この方法をもう少し詳しく説明してくれます
Mehroz Mustafa

39

ブック内のすべての列のサイズを自動調整する場合は、次の方法が便利です。

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}

に着きNullPointerExceptionましたrow.cellIterator()。セルの1つに値がないためですか?
rakeeee

10

あなたはこのようなことを試すことができます:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

ここでparamsは次のとおりです。シートの列番号とその幅ただし、幅の単位はかなり小さく、たとえば4000を試すことができます。


知ってよかった!私の目的では、列文字列が動的に生成される可能性がある場合、自動サイズ変更メソッドがケースに収まると思います。
Meow


5

以下のサンプルコード

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

//これは重要です

sheet.autoSizeColumn(0);

//引数はセル番号でなければなりません

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

出力を確認し、ナットを行きます:)


2
sheet.setColumnWidth(columnIndex、width)も見たいメソッドです
Mateen

3

列の数がわかっている場合(feはコレクションリストに等しい)。この1つのライナーを使用して、1つのシートのすべての列を調整できます(少なくともJava 8を使用している場合)。

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

以下の簡単な解決策を使用します:

これはあなたのワークブックとシートです:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

次に、列と行を含むデータをシートに追加します。シートにデータを追加したら、次のコードをautoSizeColumn幅に書き込みます。

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

ここでは、代わりに15列をシートに追加します。

誰かがこれを助けてくれることを願っています。



0

テキストを折り返すこともできます。PFBサンプルコード:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.