Java >> Java tutorial >  >> Tag >> protected

Oprette en adgangskodebeskyttet Excel-fil ved hjælp af Apache POI?

Opdateret: Fra version 3.10 understøtter POI kryptering såvel som dekryptering af XLSX-filer. Se siden "Encryption Support" på POI's hjemmeside. Nedenstående er stadig relevant for XLS binære projektmapper.

Ifølge "Encryption Support"-siden på POI's hjemmeside understøtter POI læsning af krypterede XLS- og XLSX-filer. Kryptering er ikke nævnt på den side, hvilket betyder, at det ikke er understøttet. Dette sikkerhedskopieres ved at søge på POI-siden efter "krypter", hvilket kun returnerer en håndfuld resultater, som alle handler om dekryptering. Jeg har også taget et kig på kilderne til deres kryptoimplementering, som ser ud til kun at håndtere dekryptering. Dette er ikke overraskende; POI er designet til dataudtræk og søgeindeksering, ikke til at oprette nye regneark.

Som andre har foreslået, er det ofte muligt at omgå manglende funktioner i POI ved at oprette en skabelon i Excel og derefter bruge POI til at udfylde den med data. Desværre virker det ikke til kryptering, fordi filformatet for krypterede regneark er radikalt anderledes.

Hvis du er villig til at betale for kommerciel software, har den seneste version af ExtenXLS fuld læse- og skriveunderstøttelse for alle de krypteringsformater, der understøttes af Excel. Bare konstruer en EncryptedWorkBookHandle i stedet for den normale WorkBookHandle . Det vil bruge den stærkest mulige chiffer understøttet af en umodificeret JRE, RC4 til XLS og 128-bit AES til XLSX. Hvis du vil bruge 256-bit AES med OOXML, og du har installeret JCE unlimited policy, kan du gøre det med MSOfficeEncrypter klasse.

JExcelAPI, en populær open source Java-regneark-API, ser ikke ud til at understøtte kryptering overhovedet. Aspose.Cells, et kommercielt tilbud, understøtter stærk kryptering. Dokumentationen til Actuates e.Spreadsheet ser ud til at være forsvundet fra 'nettet', så jeg kan ikke se, om den understøtter kryptering eller ej.

Da ingen af ​​de frit tilgængelige Java-regneark-API'er ser ud til at understøtte skrivning af krypterede regneark, er du nødt til at finde en løsning, hvis du ikke er villig til at bruge kommerciel software. Du kan for eksempel skrive regnearket ind i en krypteret ZIP-fil. java.util.zip understøtter ikke kryptering, men det ser ud til, at Zip4j gør.

Fuld offentliggørelse :Jeg arbejder for Extentech, firmaet bag ExtenXLS.


Opret en adgangskodebeskyttet Excel-fil, eller brug en eksisterende skabelon og gør den adgangskodebeskyttet. Dette vil dog give brugerne en "read only" adgang. Her er et eksempel, hvor jeg har en Excel-fil, der har en adgangskode, "hemmelig":

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

På samme måde bør du være i stand til at skrive eller ændre den eksisterende skabelon, som du har. Når du er færdig, skal du overskrive skabelonen. Hvis din skabelon skal bruges mange gange, vil du måske kopiere skabelonen til et andet sted og derefter bruge koden til at ændre den.


Jeg har ofte fundet ud af med POI, at for at gøre mere komplekse ting, er en nyttig tilgang at oprette regnearket i Excel med de avancerede funktioner (f.eks. makroer), og derefter bruge POI til at læse regnearket, udfylde det og skrive det ud. POI vil normalt vedligeholde regnearkets funktioner og tilføje data.

Jeg har ikke prøvet dette for adgangskoder, men jeg formoder, at det er et eksperiment værd.

Se den travle udviklervejledning for at få flere oplysninger.


Java tag