Я создаю сложный сводный отчет HTML из данных в базе данных, который может быть резюме, возможно, 200 000 строк в базе данных. Пользователь может щелкнуть ссылку, чтобы запросить версию Excel.
Когда они делают JS script, извлекают ключевые компоненты отчета и заполняют их в форме в скрытом iframe. Эта форма отправляется на серверную сторону script, которая генерирует версию отчета Excel (без графики и т.д.).
Поскольку вычисления для отчета являются сложными и "дорогостоящими", имеет смысл не запускать их снова, чтобы создать версию Excel, поскольку все данные уже находятся на странице. Кроме того, пользователь может настроить отчет после его загрузки, и я могу использовать JS для передачи этих предпочтений в форму, поэтому документ Excel также отражает их.
Я делаю это, чтобы включить следующее для каждого компонента отчета, который переносится в строку в версии Excel. Я захватил HTML-тег, который иначе не используется.
<code id="xl_row_211865_2_x" class="rowlabel">Musicals}{40%}{28.6%}{6</code>
Элемент кода выше представляет собой сводку строки ниже в отчете HTML, которая становится одной строкой в документе Excel и включает метку и различные элементы данных. В одном отчете может быть тысяча или более таких элементов.
Поскольку данные содержат текст, мне пришлось использовать что-то вроде }{
как разделитель полей, поскольку это вряд ли произойдет в любом реальном тексте отчета. У меня есть code
для отображения: none в CSS.
Когда пользователь хочет получить версию своего отчета в формате Excel, JS-код ищет HTML для любых элементов <code>
и помещает их имя класса и innerHTML в форму. Имя класса указывает, как форматировать строку в Excel, а затем данные помещаются в соседние ячейки в строке Excel.
В отчете HTML отображается одна процентная база (они могут переключаться между ними), но предпочтение пользователя при запросе версии Excel должно включать оба.
Есть ли лучший способ сделать это?
(Поскольку это часть сложного веб-приложения, ни один пользователь не собирается отключать CSS или не иметь javascript, или они не получили бы это далеко) ADDED: я не могу использовать HTML5, поскольку пользователи часто работают в старых браузерах, таких как IE6