薄給SEの技術屋日記

何でもポジティブに | 3人家族+チワワと暮らすSE | 20代は休む間も無く仕事と飲み会 | 30代から株主優待に目覚め今では節約しながら配当金投資 | 目標は配当金投資で住宅費月7万を補うこと | 大宮アルディージャサポ | 度重なる過労で体調不良となり家族と自分の身体を優先する生活 | 最近米国株の購入を開始

【技術】Javaでマクロ機能が有効なxlsmファイル、パスワード付きxlsxファイルを開く(poiを活用してExcelファイル操作)

LOLIPOP

はじめに

javaのpoiを活用してxlsm(マクロ付きファイル)とパスワード付きのExcelファイルを開いてみたいと思います。

import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.poi.poifs.crypt.Decryptor;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestBook {

	public static void main(String[] args) {

		Workbook excel = null;

		try {
			excel = new XSSFWorkbook("D:\\temp\\test\\macro.xlsm");
			Sheet sheet = excel.getSheetAt(0);

			for (int i = 0; i < 10; i++) {
				System.out.println(sheet.getRow(0).getCell(i));
			}

			FileInputStream fi = new FileInputStream("D:\\temp\\test\\password.xlsx");
			POIFSFileSystem filesystem = new POIFSFileSystem(fi);
			EncryptionInfo info = new EncryptionInfo(filesystem);
			Decryptor d = Decryptor.getInstance(info);
			if (d.verifyPassword("test") == false) {
				System.out.println("パスワードを解除できませんでした");
				return;
			}

			InputStream is = d.getDataStream(filesystem);
			Workbook wb2 = new XSSFWorkbook(is);
			Sheet sheet2 = wb2.getSheetAt(0);

			for (int i = 0; i < 10; i++) {
				System.out.println(sheet2.getRow(0).getCell(i));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}