Excel2003以前のバージョン(xls)を読み込む方法
XML形式(xlsx)を読み込む方法
パスワードがかかっているExcelファイルを読み込み、パスワードをかけて保存する方法
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.GeneralSecurityException;
- import org.apache.poi.POIXMLException;
- import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
- import org.apache.poi.openxml4j.opc.OPCPackage;
- import org.apache.poi.openxml4j.opc.PackageAccess;
- import org.apache.poi.poifs.crypt.Decryptor;
- import org.apache.poi.poifs.crypt.EncryptionInfo;
- import org.apache.poi.poifs.crypt.Encryptor;
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- 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;
-
- /**
- * Apache POI(Ver3.11)を使用して、Excelファイルを読み込み、上書き保存するサンプル。
- * パスワードがかかっているExcelにも対応。
- * xls、xlsxの両方に対応。
- * POIをダウンロードし、解凍された下記JARファイルをビルドパスに追加する必要あり。
- * poi-3.11-20141221.jar
- * poi-excelant-3.11-20141221
- * poi-ooxml-3.11-20141221.jar
- * poi-ooxml-schemas-3.11-20141221.jar
- * poi-scratchpad-3.11-20141221.jar
- * xmlbeans-2.6.0.jar
- */
- public class ExcelSample {
-
- public static void main(String[] args) {
- try {
- // xlsx形式、またはxlsm形式のパスワード付きExcelファイルを開く&保存する場合
- excelOpenXlsxPassword("C:/Test/testPass.xlsx", "password");
-
- // xls形式のパスワード付きExcelファイルを開く&保存する場合
- excelOpenXlsPassword("C:/Test/testPass.xls", "password");
-
- // パスワードがかかっていないExcelファイルを開く場合(xls、xlsxの両方に対応)
- excelOpen("C:/Test/test.xls");
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * パスワード付きExcelファイルの読み込み&書き込み。
- * Excel2003より新しい形式(xlsx、xlsm)専用の処理。
- * 参考:https://poi.apache.org/encryption.html
- * @param filePath Excelファイルのフルパス
- * @param password パスワード
- * @throws IOException
- */
- public static void excelOpenXlsxPassword(String filePath, String password) throws IOException {
- FileInputStream fi = null;
- POIFSFileSystem fileSystem = null;
- InputStream is = null;
- Workbook wb = null;
-
- try {
- fi = new FileInputStream(filePath);
- fileSystem = new POIFSFileSystem(fi);
- EncryptionInfo info = new EncryptionInfo(fileSystem);
- Decryptor d = Decryptor.getInstance(info);
-
- if (d.verifyPassword(password) == false) {
- System.out.println("パスワードを解除出来ませんでした。");
- return;
- }
-
- is = d.getDataStream(fileSystem);
- wb = new XSSFWorkbook(is);
-
- // セルの値が読めているか確認
- Sheet sheet = wb.getSheet("Sheet1");
- Row row = sheet.getRow(0);
- Cell cell = row.getCell(0);
- String val = cell.getStringCellValue();
- System.out.println("セルの値 = " + val);
-
- // 書き込みが出来るか確認
- Cell cell2 = row.createCell(1);
- cell2.setCellValue("テスト");
-
- // 新規ファイルとして保存(この時点ではパスワード無し)
- wb.write(new FileOutputStream(filePath));
-
- POIFSFileSystem fs = new POIFSFileSystem();
-
- Encryptor enc = info.getEncryptor();
- // 既存と同じパスワードを設定(新しいパスワードでも問題無し)
- enc.confirmPassword(password);
-
- OPCPackage opc = OPCPackage.open(new File(filePath), PackageAccess.READ_WRITE);
- OutputStream os = enc.getDataStream(fs);
- opc.save(os);
- opc.close();
-
- // パスワード付きで上書き保存
- FileOutputStream fos = new FileOutputStream(filePath);
- fs.writeFilesystem(fos);
- fos.close();
- }
- catch (GeneralSecurityException | IOException | InvalidFormatException e) {
- e.printStackTrace();
- }
- finally {
- if (wb != null) {
- wb.close();
- }
-
- if (is != null) {
- is.close();
- }
-
- if (fi != null) {
- fi.close();
- }
- }
- }
-
- /**
- * パスワード付きExcelファイルの読み込み&書き込み。
- * Excel2003以前の形式(xls)専用の処理。
- * 参考:https://poi.apache.org/encryption.html
- * @param filePath Excelファイルのフルパス
- * @param password パスワード
- * @throws IOException
- */
- public static void excelOpenXlsPassword(String filePath, String password) throws IOException {
- FileInputStream fi = null;
- HSSFWorkbook wb = null;
-
- try {
- fi = new FileInputStream(filePath);
- Biff8EncryptionKey.setCurrentUserPassword(password);
- wb = new HSSFWorkbook(fi);
-
- // セルの値が読めているか確認
- Sheet sheet = wb.getSheet("Sheet1");
- Row row = sheet.getRow(0);
- Cell cell = row.getCell(0);
- String val = cell.getStringCellValue();
- System.out.println("セルの値 = " + val);
-
- // 書き込みが出来るか確認
- Cell cell2 = row.createCell(1);
- cell2.setCellValue("テスト");
-
- // パスワードを設定。第二引数(ユーザー名)は任意で指定。
- wb.writeProtectWorkbook(password, "");
- // 上書き保存
- wb.write(new FileOutputStream(filePath));
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- finally {
- if (wb != null) {
- wb.close();
- }
-
- if (fi != null) {
- fi.close();
- }
- }
- }
-
- /**
- * Excelファイルの読み込み。
- * xls、xlsx両方に対応。
- * @param filePath Excelファイルのフルパス
- * @throws IOException
- */
- public static void excelOpen(String filePath) throws IOException {
- FileInputStream fi = null;
- Workbook wb = null;
-
- try {
- try {
- fi = new FileInputStream(filePath);
- // Excel2003より新しいバージョンとしてファイルを開く
- wb = new XSSFWorkbook(fi);
- }
- catch (POIXMLException e) {
- try {
- fi.close();
- fi = new FileInputStream(filePath);
- // Excel2003以前のバージョンとしてファイルを開く
- wb = new HSSFWorkbook(fi);
- }
- catch (IOException e1) {
- throw e1;
- }
- }
- catch (IOException e) {
- throw e;
- }
-
- // セルの値が読めているか確認
- Sheet sheet = wb.getSheet("Sheet1");
- Row row = sheet.getRow(0);
- Cell cell = row.getCell(0);
- String val = cell.getStringCellValue();
- System.out.println("セルの値 = " + val);
- }
- finally {
- if (wb != null) {
- wb.close();
- }
-
- if (fi != null) {
- fi.close();
- }
- }
- }
- }
|