Apache POI その他
今回はApache POIで今まで取り上げなかったことをやります。ダウンロード
Servletでダウンロードするときは書き込み先を変えます。サーブレット自体はこちらを参照ください。
package test;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@WebServlet("/TestP")
public class TestP extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestP() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF8");
// ダウンロードファイル名
String filename = "てすと.xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition",
"attachment; filename=\"" + URLEncoder.encode(filename, "UTF-8") + "\"");
response.setCharacterEncoding("UTF-8");
// ワークブック作成
try (Workbook book = new XSSFWorkbook()) {
// シート作成
Sheet sheet = book.createSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
// セル作成
Cell cell = row.createCell(0);
// セルに値セット
cell.setCellValue("test");
book.write(response.getOutputStream());
}
}
}
セル計算式の実行(Excelでファイルを開くとき)
POIで作成したExcelを開いたときにセル計算式が計算されていないことがあります。それを防ぐには以下のようにSheet.setForceFormulaRecalculationで引数にtrueを指定します。
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class PoiTest {
public static void main(String[] args) {
try (InputStream inp = new FileInputStream("C:\\work\\hp\\workbook.xlsx");
Workbook book = new XSSFWorkbook(inp);) {
// 元ファイルの読み込み
// シートの取得
Sheet sheet = book.getSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
// セル作成
Cell cell1 = row.createCell(0);
Cell cell2 = row.createCell(1);
Cell cell3 = row.createCell(2);
cell1.setCellValue(1);
cell2.setCellValue(2);
// 計算式をセット
cell3.setCellFormula("A1+B1");
// Excelを開くタイミングで再計算する設定
sheet.setForceFormulaRecalculation(true);
// ファイルに保存
String fileTo = "C:\\work\\hp\\workbook2.xlsx";
try (FileOutputStream out = new FileOutputStream(fileTo);) {
book.write(out);
book.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
セル計算式の実行(JavaでExcel作成時)
上の例では、Excelファイルを開いたときセル計算式を実行させるようにしましたが、下の例では、Javaの処理内でセル計算式を実行しています。
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class PoiTest {
public static void main(String[] args) {
try (InputStream inp = new FileInputStream("C:\\work\\hp\\workbook.xlsx");
Workbook book = new XSSFWorkbook(inp);) {
// 元ファイルの読み込み
// シートの取得
Sheet sheet = book.getSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
// セル作成
Cell cell1 = row.createCell(0);
Cell cell2 = row.createCell(1);
Cell cell3 = row.createCell(2);
cell1.setCellValue(1);
cell2.setCellValue(2);
// 計算式をセット
cell3.setCellFormula("A1+B1");
// この処理内でセル計算式を実行
book.getCreationHelper().createFormulaEvaluator().evaluateAll();
// ファイルに保存
String fileTo = "C:\\work\\hp\\workbook2.xlsx";
try (FileOutputStream out = new FileOutputStream(fileTo);) {
book.write(out);
book.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
ページのトップへ戻る