3

Jexcelを使ってみた

Vogellaチュートリアルで説明されているように、既存の Excel シートを更新します。

ここでの問題は、既存の Excel シートに既に存在するデータが、新しく書き込まれた Excel データで消去されることです。

たとえば、私がこれをExcelに持っている場合

<table>
<tr>
<td>1</td> <td>2 </td>
</tr>
<tr>
<td>3</td> <td>4 </td>
</tr>
<table>

次のように、2 と 4 の隣の新しいセルにデータを追加したい

<table>
<tr>
<td>1</td> <td>2 </td> <td>X </td>
</tr>
<tr>
<td>3</td> <td>4 </td> <td>Y </td>
</tr>
<table>

書き込みプログラムが実行された後、これが得られます

<table>
<tr>
<td> </td> <td>  </td> <td>X </td>
</tr>
<tr>
<td> </td> <td>  </td> <td>Y </td>
</tr>
<table>

Label label;
label = new Label(column, row, s, times);
sheet.addCell(label);

これは、指定された列と行にセルを追加しますが、残りの Excel データを消去します。

データを保持している既存の Excel にデータを追加するにはどうすればよいですか?

以下がプログラムです(参考:Vogella)。Excel シートには既に 20 行と最初の 2 列にデータがあり、20 行のパッケージ Excel の 3 列目にデータを追加しようとしています。

import java.io.File;
import java.io.IOException;
import java.util.Locale;

import jxl.CellView;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class WriteExcel {

    private WritableCellFormat timesBoldUnderline;
    private WritableCellFormat times;
    private String inputFile;

    public void setOutputFile(String inputFile) {
        this.inputFile = inputFile;
    }

    public void write() throws IOException, WriteException {
        File file = new File(inputFile);
        WorkbookSettings wbSettings = new WorkbookSettings();

        wbSettings.setLocale(new Locale("en", "EN"));

        WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
        workbook.createSheet("Report", 0);
        WritableSheet excelSheet = workbook.getSheet(0);
        createLabel(excelSheet);
        createContent(excelSheet);

        workbook.write();
        workbook.close();
    }

    private void createLabel(WritableSheet sheet) throws WriteException {
        // Lets create a times font
        WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
        // Define the cell format
        times = new WritableCellFormat(times10pt);
        // Lets automatically wrap the cells
        times.setWrap(true);

        // Create create a bold font with unterlines
        WritableFont times10ptBoldUnderline = new WritableFont(
                WritableFont.TIMES, 10, WritableFont.BOLD, false,
                UnderlineStyle.SINGLE);
        timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline);
        // Lets automatically wrap the cells
        timesBoldUnderline.setWrap(true);

        CellView cv = new CellView();
        cv.setFormat(times);
        cv.setFormat(timesBoldUnderline);
        cv.setAutosize(true);

    }

    private void createContent(WritableSheet sheet) throws WriteException,
            RowsExceededException {

        Integer salary = 1000;
        // Now a bit of text
        for (int i = 0; i < 20; i++) {
            // third column
            addLabel(sheet, 2, i, salary.toString());

            // WritableCell cell = sheet.getWritableCell(2, i);
            // if (cell.getType() == CellType.LABEL) {
            // Label l = (Label) cell;
            // l.setString("modified cell");
            // }
            salary += 1000;
        }

    }

    private void addLabel(WritableSheet sheet, int column, int row, String s)
            throws WriteException, RowsExceededException {
        Label label;
        label = new Label(column, row, s, times);
        sheet.addCell(label);
    }

    public static void main(String[] args) throws WriteException, IOException {
        WriteExcel test = new WriteExcel();
        test.setOutputFile("c:/temp/lars.xls");
        test.write();
        System.out
                .println("Please check the result file under c:/temp/lars.xls ");
    }
}
4

1 に答える 1