Я разрабатываю внутреннюю систему, которая должна работать так же, как Google Docs. Основная часть, которую я реализую, имитирует их реализацию веб-таблиц. По нескольким причинам я не могу использовать Google Docs или ZK, которые имеют очень надежный API Spreadsheet. Я выбрал POI 3.7 в качестве отправной точки для обработки электронных таблиц Excel.
В настоящее время, когда пользователь загружает электронную таблицу Excel, я беру файл байта [] и сохраняю его в нашей базе данных в виде большого двоичного объекта. Когда пользователь хочет просмотреть электронную таблицу, я извлекаю байт [], собираю книгу и отправляю ее в пользовательский интерфейс клиента для редактирования. Толчок к интерфейсу не моя забота. Когда пользователь вносит изменения в электронную таблицу, я отправляю изменения на сервер, сохраняю их в стеке и применяю обновления только тогда, когда пользователь нажимает кнопку «Сохранить». При сохранении я вытаскиваю книгу из базы данных, вносю изменения и возвращаю книгу обратно в базу данных. Таким образом, я не храню это в памяти. Неудивительно, что все это происходит довольно быстро, за исключением случаев, когда несколько пользователей начинают это делать, очевидно, что взрывающиеся рабочие книги пожирают память, как описано в других постах здесь.
Пользователь будет обновлять только одну вкладку за раз, зачем мне открывать всю книгу целиком? Когда пользователь изначально загружает электронную таблицу Excel, могу ли я вытащить каждый лист, преобразовать каждый в байт [] и сохранить каждый как отдельную запись в БД «рабочего листа»? В POI Sheet есть защищенный метод "#write (Stream)", но я бы не хотел заниматься повторной компиляцией POI. Я также не хотел бы взрывать каждую клетку как новую запись в БД. Вы, ребята, сделали бы это по-другому в первую очередь?
Бэкэнд - это Java / Spring / JDBC. По внутренним причинам это технологии, которые я использую.