programing

Apache POI를 사용하여 암호로 보호되는 Excel 파일을 생성하시겠습니까?

css3 2023. 8. 23. 21:54

Apache POI를 사용하여 암호로 보호되는 Excel 파일을 생성하시겠습니까?

(Apache POI) API를 이용하여 엑셀 파일을 만들 수 있는 간단한 자바 프로그램을 개발하고 있습니다.Oracle 10g을 데이터베이스로 사용하고 있으며 ojdbc14 JAR 파일을 사용하고 있습니다.

USERINFO라는 테이블이 , USERINFO, USERINFO라는 세 개의 열이 .USERNAME,PASSWORD,그리고.NAME.이제 Apache POI를 사용하여 모든 행을 Excel 파일에 넣을 수 있습니다.

파일에 사용자 이름과 암호와 같은 중요한 데이터가 포함되어 있기 때문에 암호로 보호하고 싶습니다.포럼에서 암호로 보호된 파일을 읽는 방법은 찾았지만 만드는 방법은 찾지 못했습니다.어떻게 하면 이를 달성할 수 있을까요?

업데이트됨:버전 3.10부터 POI는 XLSX 파일에 대한 암호화 및 암호 해독을 지원합니다.POI 사이트의 "암호화 지원" 페이지를 참조하십시오.다음은 XLS 이진 워크북과 관련이 있습니다.

POI 웹 사이트의 "암호화 지원" 페이지에 따르면 POI는 암호화된 XLS 및 XLSX 파일 읽기를 지원합니다.암호화는 해당 페이지에서 언급되지 않았습니다. 이는 암호화는 암호화가 지원되지 않음을 의미합니다.이는 POI 사이트에서 "암호화"검색하여 백업되며, 암호 해독과 관련된 소수의 결과만 반환됩니다.암호 해독만 처리하는 것으로 보이는 암호화 구현의 출처도 살펴봤습니다.POI는 새 스프레드시트를 만들기 위한 것이 아니라 데이터 추출 및 검색 인덱싱을 위해 설계되었습니다.

다른 사람들이 제안했듯이, 종종 Excel에서 템플릿을 만든 다음 POI를 사용하여 데이터를 채우는 방식으로 POI에서 누락된 기능을 해결할 수 있습니다.그러나 암호화된 스프레드시트의 파일 형식이 근본적으로 다르기 때문에 암호화에는 사용할 수 없습니다.

상용 소프트웨어에 대한 비용을 지불할 의향이 있다면 ExtendX의 최신 버전LS는 Excel에서 지원하는 모든 암호화 형식에 대해 완전한 읽기 및 쓰기 지원을 제공합니다.구성하기만 하면 됩니다.EncryptedWorkBookHandle의 통이아 WorkBookHandle그것은 수정되지 않은 JRE, XLS의 RC4 및 XLSX의 128비트 AES에서 지원되는 가장 강력한 암호를 사용할 것입니다.256비트 AES를 OOXML과 함께 사용하고 JCE 무제한 정책을 설치한 경우MSOfficeEncrypter학급.

인기 있는 오픈 소스 Java 스프레드시트 API인 Jexcel API는 암호화를 전혀 지원하지 않는 것으로 보입니다.포즈.상용 서비스인 셀은 강력한 암호화를 지원합니다.Activate의 문서입니다.스프레드시트가 '넷'에서 사라진 것 같아 암호화를 지원하는지 알 수 없습니다.

무료로 사용할 수 있는 Java 스프레드시트 API 중 암호화된 스프레드시트를 작성할 수 있는 것은 없으므로 상용 소프트웨어를 사용하지 않으려면 해결 방법을 찾아야 합니다.예를 들어 암호화된 ZIP 파일에 스프레드시트를 쓸 수 있습니다.java.util.zip암호화는 지원하지 않지만 Zip4j는 지원하는 것처럼 보입니다.

전체 공개:저는 ExtendX의 배후에 있는 Extendech에서 일합니다.LS.

암호로 보호되는 Excel 파일을 만들거나 기존 템플릿을 사용하여 암호로 보호되도록 합니다.이렇게 하면 사용자에게 "읽기 전용" 액세스 권한이 부여됩니다.다음은 "비밀"이라는 암호를 가진 Excel 파일의 예입니다.

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;

public class ProtectedExcelFile {

    public static void main(final String... args) throws Exception {

        String fname = "C:\\Documents and Settings\\sadutta\\Desktop\\sample.xls";

        FileInputStream fileInput = null;
        BufferedInputStream bufferInput = null;
        POIFSFileSystem poiFileSystem = null;
        FileOutputStream fileOut = null;

        try {
            fileInput = new FileInputStream(fname);
            bufferInput = new BufferedInputStream(fileInput);
            poiFileSystem = new POIFSFileSystem(bufferInput);

            Biff8EncryptionKey.setCurrentUserPassword("secret");
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
            HSSFSheet sheet = workbook.getSheetAt(0);

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!");

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);
        }
        catch (Exception ex) {

            System.out.println(ex.getMessage());
        }
        finally {
            try {

                bufferInput.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }

            try {

                fileOut.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }
        }
    }
}

기존 템플릿을 작성하거나 수정할 수 있는 것과 동일한 방법입니다.작업이 완료되면 템플릿을 덮어씁니다.템플리트를 여러 번 사용해야 하는 경우, 템플리트를 다른 위치에 복사한 후 코드를 사용하여 수정할 수 있습니다.

POI를 사용할 때 더 복잡한 작업을 수행하려면 고급 기능(예: 매크로)을 사용하여 Excel로 스프레드시트를 만든 다음 POI를 사용하여 스프레드시트를 읽고, 채우고, 쓰는 것이 유용하다는 것을 자주 알게 되었습니다.POI는 일반적으로 스프레드시트 기능을 유지 관리하고 데이터를 추가합니다.

나는 비밀번호를 위해 이것을 시도해 본 적은 없지만, 나는 그것이 실험할 가치가 있다고 생각합니다.

자세한 내용은 사용 중인 개발자 안내서를 참조하십시오.

다음 프로그램은 지정된 Excel 경로에서 암호로 보호된 Excel 파일을 생성합니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
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.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
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.xssf.usermodel.XSSFWorkbook;
public class MyTest1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Raju\\Desktop\\workbook1.xlsx");
        try {
            file.createNewFile();
            OutputStream fileOut = new FileOutputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook();
            Sheet sheet = wb.createSheet();
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("Venu");
            wb.write(fileOut);
            wb.close();
            fileOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try (POIFSFileSystem fs = new POIFSFileSystem()) {
            EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
            // EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile,
            // CipherAlgorithm.aes192, HashAlgorithm.sha384, -1, -1, null);
            Encryptor enc = info.getEncryptor();
            enc.confirmPassword("hello");
            // Read in an existing OOXML file and write to encrypted output stream
            // don't forget to close the output stream otherwise the padding bytes aren't
            // added
            try (OPCPackage opc = OPCPackage.open(file, PackageAccess.READ_WRITE);
                    OutputStream os = enc.getDataStream(fs)) {
                opc.save(os);
            } catch (InvalidFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (GeneralSecurityException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            // Write out the encrypted version
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fs.writeFilesystem(fos);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        System.out.println("Excel file exported");
    }
}

사용된 메이븐 종속성

<dependency>
 <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>

네, 저는 우리가 많은 코드를 최적화할 수 있다는 것을 알고 있습니다.높은 수준에서 프로그램이 작동합니다.

언급URL : https://stackoverflow.com/questions/8817290/create-a-password-protected-excel-file-using-apache-poi