Главная Библиотека Шаблоны и примерыJava: внутри файла MS Excel 2007. Часть третья
Николай Норкин
г. Киров
notesnet@notesnet.ru
Часть первая
Часть вторая
Часть четвёртая
Начало работы с файлом электронной таблицы Microsoft Excel
В прошлых материалах автора читатель имел возможность научиться получать доступ к файлам, находящимся в структурах хранения Lotus Domino (в дизайне баз данных и в пользовательских документах), и к файлам, загружаемым на сервер через http-сервис Domino. Не будем останавливаться на том, как средствами Java загрузить в поток файл из файловой системы, в этом легко помогут описания и примеры из Интернета
С процессом "разархивирования" потока, представляющего таблицу MS Excel, при помощи пакета java.util.zip, наш читатель также мог встретиться на страницах проекта. Тем не ненее, повторим код, обрабатывающий архивные файлы
public void init(java.io.InputStream stream) {
try {
java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(stream);
java.util.zip.ZipEntry entry;
String name;
while ((entry = zip.getNextEntry()) != null) {
name = entry.getName();
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(1024);
byte[] buf = new byte[1024];
int len = zip.read(buf);
while (len > 0) {
baos.write(buf, 0, len);
len = zip.read(buf);
}
в этом месте получен доступ к имени файла в архиве (включая путь) в переменной name и содержимому файла в потоке baos
}
}
catch (Exception e) {}
}
В зависимости от имени файла, вызываются различные процедуры загрузки
if (name.equals("xl/sharedStrings.xml")) this.initStrings(baos.toByteArray());
if (name.equals("xl/workbook.xml")) this.parseWorkbook(baos.toByteArray());
if (name.equals("xl/_rels/workbook.xml.rels")) this.parseRelations(baos.toByteArray());
if (name.equals("xl/styles.xml")) this.parseStyles(baos.toByteArray());
if (name.startsWith("xl/worksheets/sheet")) this.loadWorksheet(name, baos.toByteArray());
Строки из файла xl/sharedStrings.xml размещаются в объекте вектора stringContent
protected void initStrings(byte[] content) {
try {
org.w3c.dom.Document document = this.stringToDocument(content);
this.stringContent = new java.util.Vector();
org.w3c.dom.NodeList nodes = document.getElementsByTagName("sst");
try {
org.w3c.dom.Element root = (org.w3c.dom.Element) nodes.item(0);
this.stringTotal = Long.parseLong(root.getAttribute("count"));
}
catch (Exception e) {}
nodes = document.getElementsByTagName("si");
for (int i = 0; i < nodes.getLength(); i++) { // шпарим по списку
org.w3c.dom.Node string = nodes.item(i); // получаем ентри списка
this.stringContent.add(string.getTextContent());
}
}
catch (Exception e) {}
}
Из значений файла xl/styles.xml формируются вектор numberFormats, состоящий из значений атрибутов numFmtId элементов раздела cellXfs, связывающих атрибут формата ячейки и формат значений, и объект java.util.HashMap numberFormatMap, содержащий описание непредустановленных форматов значений ячеек - из раздела numFmts (подробнее это рассматривалось в предыдущей части материала)
protected void parseStyles(byte[] content) {
try {
org.w3c.dom.Document document = this.stringToDocument(content);
this.styles = document;
try {
this.refreshStyles();
this.numberFormats = new java.util.Vector ();
org.w3c.dom.NodeList nodes = document.getElementsByTagName("cellXfs");
org.w3c.dom.Element styles = (org.w3c.dom.Element) nodes.item(0);
nodes = styles.getElementsByTagName("xf");
for (int i = 0; i < nodes.getLength(); i++) { // шпарим по списку
org.w3c.dom.Element style = (org.w3c.dom.Element) nodes.item(i); // получаем ентри списка
String format = style.getAttribute("numFmtId");
this.numberFormats.add(format);
}
}
catch (Exception e) {}
try {
this.numberFormatMap = new java.util.HashMap ();
org.w3c.dom.NodeList nodes = document.getElementsByTagName("numFmts");
org.w3c.dom.Element styles = (org.w3c.dom.Element) nodes.item(0);
nodes = styles.getElementsByTagName("numFmt");
for (int i = 0; i < nodes.getLength(); i++) { // шпарим по списку
org.w3c.dom.Element element = (org.w3c.dom.Element) nodes.item(i); // получаем ентри списка
ru.medkirov.design.excel2007.NumberFormat format =
new ru.medkirov.design.excel2007.NumberFormat(element);
String id = format.id();
if (!id.equals(""))
this.numberFormatMap.put(id, format);
}
}
catch (Exception e) {}
}
catch (Exception e) {}
}
Ссылки
Java: внутри файла MS Excel 2007. Часть первая
Java: внутри файла MS Excel 2007. Часть вторая
Java: внутри файла MS Excel 2007. Часть четвёртая
Java в Domino. Небольшой пример обработки потока
Java в Domino. Вывод в поток присоединённых файлов
Java в Domino. Получение файловых элементов дизайна приложений Domino в виде потоковых данных
|
Опубликовано — 02/06/2022 |
| |
|
|