1

次のコードを使用して、JXL API で ComboBox を表示しようとしています。

ArrayList<String> arrList = new ArrayList<String>();
arrList.add("DropDown1");
arrList.add("DropDown2");
arrList.add("DropDown3");
WritableCellFeatures cellFeatures = new WritableCellFeatures();
cellFeatures.setDataValidationList(arrList);

Blank b = null;
Label checkLabel = null;
for (int x = 0; x < xlData.size(); x++) {
    for (int i = 0; i <= 14; i++) {
        System.out.println("X:" + x + "I:" + i);
        if (i > 9) {
            checkLabel = new Label(i, x + xlHeader.size(),(String) arrList.get(0));
            //b = new Blank(i, x + xlHeader.size());
            //b.setCellFeatures(cellFeatures);
            checkLabel.setCellFeatures(cellFeatures);
            writableSheet.addCell(checkLabel);
            System.out.println("Combo Cell : " + x + ":" + i);
        }
    }
}

「空白」セルと「ラベル」の両方を試しました。しかし、それでも Excel には ComboBox が表示されません。

4

1 に答える 1

2

最初に write() を呼び出さずに close() を呼び出すと、完全に空のファイルが生成されます。

ワークブックへのシートとセルの追加が完了したら、ワークブックで write() を呼び出し、ファイルを閉じます。この最後の手順により、Excel で読み取ることができる出力ファイル (この場合は output.xls) が生成されます。追加する必要があるこの優れたチュートリアルの功績は次のとおりです。

        copy.write(); 
        copy.close();

cellFeatures はループ内で再インスタンス化する必要があります

私のテストによると、このコードは正常に動作します:

        WritableCellFeatures cellFeatures =  null;
        Label checkLabel = null;
        for (int x = 0; x < xlData.size(); x++) {
            for (int i = 0; i <= 14; i++) {
                System.out.println("X:" + x + "I:" + i);
                if (i > 9) {
                   checkLabel = new Label(i, x + xlHeader.size(), (String) arrList.get(0));
                   cellFeatures = new WritableCellFeatures();
                   cellFeatures.setDataValidationList(arrList);
                   checkLabel.setCellFeatures(cellFeatures);
                   writableSheet.addCell(checkLabel);                           
                }
            }
        }
        // All cells modified/added. Now write out the workbook 
        workbook.write();
        workbook.close();

空白のバージョンでも機能しますが、この場合、セルには初期値がありません

私のテストによると、このコードも正常に動作します:

        WritableCellFeatures cellFeatures =  null;
        Blank b = null;
        for (int x = 0; x < xlData.size(); x++) {
            for (int i = 0; i <= 14; i++) {
                System.out.println("X:" + x + "I:" + i);
                if (i > 9) {
                   b = new Blank(i, x + xlHeader.size());
                   cellFeatures = new WritableCellFeatures();
                   cellFeatures.setDataValidationList(arrList);
                   b.setCellFeatures(cellFeatures);
                   writableSheet.addCell(b);                           
                }
            }
        }
        // All cells modified/added. Now write out the workbook 
        workbook.write();
        workbook.close();

生成されたファイルを Excel 2010 または Excel 2013 で開いた場合、コンボを表示するには名前を.xls付けて保存する必要がある場合があります。.xlsx

Excel2010/2013 で .xls を開くと、実際にはセルにデータ検証リストが含まれていて、検証制約が機能していても、データ検証の矢印が表示されないことがありました。矢印とコンボボックスを表示したい場合は、新しい形式で保存する必要があります。

さらに、この欠点は、JXL ではなく、最新の Excel バージョンが原因であると思われます。これは、OpenOffice.org Cal 3.4.1 で .xls を開いても問題がなく、コンボが正しく機能するという事実によって実証されています。これは、テストに使用する 現在のバージョンjxl 2.6.12 2009-10-26 Excel 2000 形式でスプレッドシートを生成するという事実に関連している可能性があります。


この回答用に開発された Java コードは、それを改善したり、フォークして遊んだりしたい人なら誰でも利用できます。

于 2013-09-19T19:20:40.387 に答える