トッカンソフトウェア

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();
		}
	}
}


			


ページのトップへ戻る