0

POIでExcelの最後の行を取得し、空白行を追加して、空白行の後に次のレコードを書き込む方法

以下は私のコードスニペットです

public class ResultSetToExcel {
            private HSSFWorkbook workbook;
            private HSSFSheet sheet;
            private HSSFFont boldFont;
            private HSSFDataFormat format;
            private ResultSet resultSet;
            private FormatType[] formatTypes;

            public ResultSetToExcel(ResultSet resultSet, FormatType[] formatTypes, String sheetName) {
                workbook = new HSSFWorkbook();
                this.resultSet = resultSet;
                sheet = workbook.createSheet(sheetName);
                boldFont = workbook.createFont();
                boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                format = workbook.createDataFormat();
                this.formatTypes = formatTypes;
            }

            public ResultSetToExcel(ResultSet resultSet, String sheetName) {
                this(resultSet, null, sheetName);
            }

            private FormatType getFormatType(Class _class) {
                if (_class == Integer.class || _class == Long.class) {
                    return FormatType.INTEGER;
                } else if (_class == Float.class || _class == Double.class) {
                    return FormatType.FLOAT;
                } else if (_class == Timestamp.class || _class == java.sql.Date.class) {
                    return FormatType.DATE;
                } else {
                    return FormatType.TEXT;
                }
            }

            public void generate(OutputStream outputStream) throws Exception {
                try {
                    ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
                    if (formatTypes != null && formatTypes.length != resultSetMetaData.getColumnCount()) {
                        throw new IllegalStateException("Number of types is not identical to number of resultset columns. "
                                + "Number of types: " + formatTypes.length + ". Number of columns: "
                                + resultSetMetaData.getColumnCount());
                    }
                    int currentRow = 0;
                    HSSFRow row = sheet.createRow(currentRow);
                    int numCols = resultSetMetaData.getColumnCount();
                    boolean isAutoDecideFormatTypes;
                    if (isAutoDecideFormatTypes = (formatTypes == null)) {
                        formatTypes = new FormatType[numCols];
                    }
                    for (int i = 0; i < numCols; i++) {
                        String title = resultSetMetaData.getColumnName(i + 1);
                        writeCell(row, i, title, FormatType.TEXT, boldFont);
                        if (isAutoDecideFormatTypes) {
                            Class _class = Class.forName(resultSetMetaData.getColumnClassName(i + 1));
                            formatTypes[i] = getFormatType(_class);
                        }
                    }

                    currentRow++; // Write report rows
                    while (resultSet.next()) {
                        row = sheet.createRow(currentRow++);
                        for (int i = 0; i < numCols; i++) {
                            Object value = resultSet.getObject(i + 1);
                            writeCell(row, i, value, formatTypes[i]);
                        }
                    }
                    // Autosize columns
                    for (int i = 0; i < numCols; i++) {
                        sheet.autoSizeColumn((short) i);
                    }
                    workbook.write(outputStream);
                } finally {
                    outputStream.close();
                }
            }

            public void generate(File file) throws Exception {
                generate(new FileOutputStream(file));
            }

            private void writeCell(HSSFRow row, int col, Object value, FormatType formatType) throws NestableException {
                writeCell(row, col, value, formatType, null, null);
            }

            private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, HSSFFont font)
                    throws NestableException {
                writeCell(row, col, value, formatType, null, font);
            }

            private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, Short bgColor, HSSFFont font)
                    throws NestableException {
                HSSFCell cell = HSSFCellUtil.createCell(row, col, null);
                if (value == null) {
                    return;
                }
                if (font != null) {
                    HSSFCellStyle style = workbook.createCellStyle();
                    style.setFont(font);
                    cell.setCellStyle(style);
                }
                switch (formatType) {
                case TEXT:
                    cell.setCellValue(value.toString());
                    break;
                case INTEGER:
                    cell.setCellValue(((Number) value).intValue());
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                            .getBuiltinFormat(("#,##0")));
                    break;
                case FLOAT:
                    cell.setCellValue(((Number) value).doubleValue());
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                            .getBuiltinFormat(("#,##0.00")));

                    break;
                case DATE:
                    cell.setCellValue((Timestamp) value);
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                            .getBuiltinFormat(("m/d/yy")));
                    break;
                case MONEY:
                    cell.setCellValue(((Number) value).intValue());
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, format
                            .getFormat("($#,##0.00);($#,##0.00)"));
                    break;
                case PERCENTAGE:
                    cell.setCellValue(((Number) value).doubleValue());
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                            .getBuiltinFormat("0.00%"));
                }
                if (bgColor != null) {
                    HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.FILL_FOREGROUND_COLOR, bgColor);
                    HSSFCellUtil
                            .setCellStyleProperty(cell, workbook, HSSFCellUtil.FILL_PATTERN, HSSFCellStyle.SOLID_FOREGROUND);
                }
            }

            public enum FormatType {
                TEXT, INTEGER, FLOAT, DATE, MONEY, PERCENTAGE
            }
        }

そして、上記のコードを実装するクラス

  ResultSetToExcel resultSetToExcel = new ResultSetToExcel(iResultSet, csv_file_name); 
             int fileCount = 1; 
             while (true) { 
             boolean done = resultSetToExcel.generate(new File(csv_file_path+ csv_file_name)); 
             if (done) break; 
             csv_file_name = csv_file_name + "_" + fileCount + ".xls"; 
             fileCount++; 
             } 

編集:

以下のスニペットを使用しました

InputStream myxls = new FileInputStream("test.xls");
 Workbook book = new HSSFWorkbook(myxls); 
Sheet sheet = book.getSheetAt(0); 
System.out.println(sheet.getLastRowNum()); 

しかし、私はこのエラーを受け取ります

java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 bytes
4

1 に答える 1

0

重要なのは例外で、数字は0です。

java.io.IOException:ヘッダー全体を読み取ることができません。0バイトの読み取り。予想される512バイト

POIは、ファイルの先頭にあるはずの512バイトのヘッダーを読み取りましたが、ファイルに0バイトが見つかりました-ファイルは空です。

ロードする正しいファイル名を渡していることを確認してください。(タグに支柱について言及している場合、実行時に期待したディレクトリにいない可能性があります...)

また、コードを少し改善することをお勧めします。ファイルがあり、共通のインターフェイスを使用しているため、ブックの読み込み方法を変更する必要があります。あなたの現在の代わりに:

InputStream myxls = new FileInputStream("test.xls");
Workbook book = new HSSFWorkbook(myxls); 

あなたははるかに良いでしょう

Workbook book = WorkbookFactory.create(new File("test.xls"));

InputStreamを介してではなく、ファイルから直接ロードすると、パフォーマンスが向上し、メモリフットプリントが減少します。WorkbookFactoryを使用することにより、コードはXLSファイルとXLSXファイルの両方で機能します。

于 2012-07-02T10:46:58.583 に答える