Программное взаимодействие с переключателями и флажками Excel с использованием Apache POI - PullRequest
0 голосов
/ 06 декабря 2018

В настоящее время я оборачиваюсь вокруг отчетного листа в Excel (.xlsx), который мне нужно заполнить для возмещения командировочных расходов.Этот документ является монстром и значительно замедляет мой компьютер, поэтому я решил создать небольшой «генератор», чтобы мне не нужно было открывать файл .xlsx для редактирования.Идея состояла в том, чтобы предоставить всю информацию в простом файле .csv, программно прочитать эти данные и использовать Apache POI для заполнения всех данных в нужных местах.

Мне удалось заставить работать простые случаи:

Workbook wb = WorkbookFactory.create(new File("in.xlsx"));
Sheet s = wb.getSheet("Sheet X");
s.getRow(16).getCell(12).setCellValue("some value");
...
FileOutputStream fileOut = new FileOutputStream("out.xlsx");
wb.write(fileOut);
fileOut.close();

К сожалению, отчетный лист также содержит флажки и переключатели, которые автоматически устанавливают некоторые поля, и я не понимаю, как получить к ним доступ, не говоря уже о том, чтобы «щелкать» по ним программно.Я начал читать XML, сгенерированный Excel, и обнаружил раздел <controls> внутри XML-листа.Мне не разрешено предоставлять доступ к файлу, но он содержит флажки, такие как:

<control shapeId="8193" r:id="rId5" name="Check Box 1">
    <controlPr defaultSize="0" autoFill="0" autoLine="0" autoPict="0">
        <anchor moveWithCells="1">
            <from><xdr:col>5</xdr:col><xdr:colOff>558800</xdr:colOff><xdr:row>16</xdr:row><xdr:rowOff>12700</xdr:rowOff></from>
            <to><xdr:col>5</xdr:col><xdr:colOff>1028700</xdr:colOff><xdr:row>17</xdr:row><xdr:rowOff>0</xdr:rowOff></to>
        </anchor>
    </controlPr>
</control>

или переключатели, такие как:

<control shapeId="5121" r:id="rId6" name="Group Box 1">
    <controlPr defaultSize="0" autoFill="0" autoPict="0">
        <anchor moveWithCells="1">
            <from><xdr:col>3</xdr:col><xdr:colOff>25400</xdr:colOff><xdr:row>16</xdr:row><xdr:rowOff>0</xdr:rowOff></from>
            <to><xdr:col>7</xdr:col><xdr:colOff>12700</xdr:colOff><xdr:row>17</xdr:row><xdr:rowOff>0</xdr:rowOff></to>
        </anchor>
    </controlPr>
</control>
<control shapeId="5122" r:id="rId7" name="Option Button 2">
    <controlPr defaultSize="0" autoFill="0" autoLine="0" autoPict="0">
        <anchor moveWithCells="1">
            <from><xdr:col>3</xdr:col><xdr:colOff>571500</xdr:colOff><xdr:row>16</xdr:row><xdr:rowOff>12700</xdr:rowOff></from>
            <to><xdr:col>3</xdr:col><xdr:colOff>977900</xdr:colOff><xdr:row>17</xdr:row><xdr:rowOff>0</xdr:rowOff></to>
        </anchor>
    </controlPr>
</control>
...
(there are always three radio buttons per group)

Из чтения содержимого XML-файла .xslx и воспроизведенияПримерно с настройками, которые я на самом деле МОГУТ установить через POI, я обнаружил следующее:

  • (Не-). Установка флажков устанавливает для конкретной целевой ячейки значение ИСТИНА / ЛОЖЬ и выборпереключатель устанавливает определенную целевую ячейку на некоторое значение.«Якорь» в моих примерах, похоже, влияет только на дизайн листа, а фактическая привязка и настройка значений выполняется в файлах xl / ctrlProps / *. Xml, которые вы видите при извлечении файла .xlsx.Чтобы найти нужный файл, вам нужно найти r: id элемента управления в файле xl/worksheets/_rels/*.rels, который снова указывает на нужный файл в ctrlProps.

  • Получаетсяиз-за того, что эти привязки на самом деле являются двунаправленными, поэтому запись TRUE в указанную ячейку также помечает флажок, когда я снова открываю Excel.Таким же образом, запись правильного числа в целевую ячейку также выбирает правильную кнопку-переключатель.Тем не менее, Apache POI имеет ограниченные возможности, только когда он выполняет встроенный код, который может запускаться элементами управления.В результате, мои программные изменения не распространяются на все ячейки листа, хотя отсутствующие ячейки содержат только простые поточные вычисления.

  • Как указывает @racraman,можно «пересчитать» результаты из простого выражения.

Сейчас я пытаюсь найти ответ на следующие два основных вопроса:

1)Где в файловой структуре .xlsx найти макросы VBA, чтобы увидеть, что будет выполнено по щелчку в Excel?

2) Когда дело доходит до «пересчета» ... зачем это вообще нужнодля динамически рассчитанных ячеек?Сохраняются ли результаты оценки в документе?Я всегда думал, что Excel вычисляет все при первом открытии, но я понимаю, что имеет смысл хранить их для потенциально более быстрого времени загрузки.

Я был бы очень признателен за любые указатели.

...