стили. xml нарушение защищенного паролем XSSFWorkbook (Apache POI v3.16) процесс сохранения [решено] - PullRequest
1 голос
/ 28 мая 2020

В настоящее время используется Apache POI 3.16 на Java версии 1.7.0-251 (Unix)

Взять лист из примера, объясненного @Aniruddh Chandegra ( Как создать и отредактируйте лист Excel для защиты паролем, используя Apache POI 3.14? )

[EDIT - добавлен приведенный ниже код, чтобы показать, что я делаю: создает XSSFWorkbook и извлекает данные, затем шифрует]

Примечание: я запускаю код на стороне сервера Javascript с использованием Mozilla Rhino v1.7R3, который обеспечивает поддержку почти всех ECMAScript Edition 5, а также некоторых функций из Mozilla Javascript 1.8.

var wb = new XSSFWorkbook();
var createHelper = wb.getCreationHelper();

// Begin filling in rows/cells
addMostRecentSheet(wb);

var filepath = [hidden]
var fileOut = new java.io.FileOutputStream(filepath);
wb.write(fileOut);
fileOut.close();

var fs = new POIFSFileSystem();

var info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes192, HashAlgorithm.sha384, -1, -1, null);
var enc = info.getEncryptor();
enc.confirmPassword("password");

var os = enc.getDataStream(fs);
opc.saveImpl(os);  //<<-----Crash there - unable to save /x1/styles.xml
opc.close();

var fos = new java.io.FileOutputStream(filepath);
fs.writeFilesystem(fos);
fos.close();  

В конце концов мне удалось сохранить защищенный паролем xlsx, но мне пришлось удалить стили столбцов Date.

Ниже приведен код для форматирования ячеек в тип ячейки Date:

function createDateCell(row, colNum, value)
{
    var cell;
    if (value)
    {
        cell = row.createCell(colNum);
        cell.setCellValue(value);
        var cellStyle = wb.createCellStyle();
        cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
        cell.setCellStyle(cellStyle)
    }
    else
    {
        cell = row.createCell(colNum, Cell.CELL_TYPE_BLANK);
    }
    return cell;
}

Тем не менее, при запуске программы я продолжаю получать эту ошибку. Есть ли обходной путь, чтобы сохранить тип столбца Дата? Сообщение об ошибке:

org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: 
Fail to save: an error occurs while saving the package : 
The part /xl/styles.xml failed to be saved in the stream with marshaller
org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@216fb8e 

1 Ответ

1 голос
/ 07 июня 2020

Чтобы создать ячейки стиля даты, вам нужно сделать следующее:

var wb = new XSSFWorkbook();
var createHelper = wb.getCreationHelper();
var dateStyle = wb.createCellStyle();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));

Это нужно сделать только один раз. Установив cellStyle вверху, вы заполнили /xl/styles.xml только один раз.

При заполнении ячеек вы просто добавляете dateStyle к функции:

createDateCell(row, colNum++, tables.SHE_SOUTH.DOB.value, dateStyle);

Функция createDateCell просто добавляете cellStyle:

function createDateCell(row,colNum,value, cellStyle){
    var cell;
    if(value){
        cell = row.createCell(colNum, Cell.CELL_TYPE_NUMERIC);
        cell.setCellValue(value);
        cell.setCellStyle(cellStyle);
    }
    else
    {
        cell = row.createCell(colNum, Cell.CELL_TYPE_BLANK);
    }
    return cell;
}

Таким образом, /xl/styles.xml не раздувается, как раньше. Что позволяет зашифровать книгу. Прекрасно работает с Axel Richter

...