Как разобрать excel файл

Время на прочтение
25 мин

Количество просмотров 34K

Недавно мне понадобилось встроить в CRM возможность создания отчетов в Excel посредством PHP, но готовые решения были сильно громоздкими. Поэтому я решил написать собственную библиотеку для работы с Excel файлами через PHP. Но информации о внутренности Excel было очень мало и мне пришлось собирать ее по крупинкам, иногда методами тыка, проб и ошибок разбирал работу некоторых элементов.

На написание данной статьи меня натолкнули уже существующие статьи от @Lachrimae.

Но дополнять ее в комментариях — очень громоздко и неудобно. Поэтому я решил поделиться всеми свои знаниями в новой статье, и если это поможет кому-то, то мои старания будут более, чем не напрасны.

Оглавление:

  1. Структура файлов;

  2. Разбор файла _rels/.rels;

  3. Разбор docProps/app.xml;

  4. Разбор docProps/core.xml;

  5. Разбор xl/_rels/workbook.xml.rels;

  6. Разбор xl/printerSettings/printerSettings1.bin;

  7. Разбор xl/theme/theme1.xml;

  8. Разбор xl/worksheets/_rels/sheet1.xml.rels;

  9. Разбор xl/worksheets/sheet1.xml;

  10. Разбор xl/caclChain.xml;

  11. Разбор xl/sharedStrings.xml;

  12. Разбор xl/styles.xml;

  13. Разбор xl/workbook.xml;

  14. Разбор [Content_Types].xml;

  15. Завершение.

Структура файлов

Так как Excel — это архив файлов .xml, то мы можем его распаковать и увидеть следующее содержание:

Дерево файлов и подкаталогов

Дерево файлов и подкаталогов

Некоторые файлы могут отсутствовать, такие как: xl/worksheets/_rels/sheet.xml.rels, xl/calcChain.xml, xl/printerSettings/printerSettings1.bin и sharedString.xml

В папках xl/worksheets, xl/printerSettings и xl/worksheets/_rels могут быть по несколько файлов.

Давайте разберёмся, для чего все эти файлы, начнём по порядку:

_rels/.rels — описание связей файлов, касаемых самой работы Excel;

docProps/app.xml — описание и настройки приложения Excel;

docProps/core.xml — здесь записывается имя создателя файла, время создания и последнего редактирования файла;

xl/_rels/workbook.xml.rels — перечень и описание зависимостей файлов, используемых в книге;

xl/printerSettings/printerSettings1.bin — описание настроек для печати листа;

xl/theme/theme1.xml — описание стилей приложения;

xl/worksheets/_rels/sheet1.xml.rels — описание связей листа xl/worksheets/sheet1.xml с другими документами;

xl/worksheets/sheet1.xml — описание всего происходящего на листе, который находится на первой позиции в списке листов книги. Название листа и название файла никак не связаны, файл всегда называется sheet1, sheet2 и т.д. На каждый лист приходится один такой файл;

xl/caclChain.xml — цепочка вычислений. Конструкция, указывающая порядок вычислений ячеек в книге в последний раз;

xl/sharedStrings.xml — перечень строковых значений, используемых во всей книге;

xl/styles.xml — описание стилей, используемых во всей книге;

xl/workbook.xml — описание настроек книги и перечень используемых листов;

[Content_Types].xml — описание всех файлов и их типов.

Разбор файла _rels/.rels

Если открыть файл — мы увидим следующее содержание:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
</Relationships>

В первой строке у нас объявляется тип документа — xml с его версией, кодировкой и автономности.

standalone (автономность) — Это объявление указывает, содержит ли внешнее подмножество DTD (Document Type Definition — определение типа документа) какие-либо объявления, которые могут повлиять на текущее содержимое документа.

Вторая строчка — открывающий тег для описания связей документов. Атрибут xmlns — означает, что используется пространство имен, от сюда и название самого атрибута — xml NameSpace.

Далее идут 3 строки связей с документами. У каждого есть атрибуты: Id — уникальное имя для связи, Type — ссылка на стандарт, описывающий нужный нам тип документа, Target — путь к исполняемому файлу.

Разбор docProps/app.xml

Содержимое данного файла примерно такая (не все элементы могут присутствовать и иметь тот же вид, что и у меня):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
    <Application>Microsoft Excel</Application>
    <DocSecurity>0</DocSecurity>
    <ScaleCrop>false</ScaleCrop>
    <HeadingPairs>
        <vt:vector size="2" baseType="variant">
            <vt:variant>
                <vt:lpstr>Worksheets</vt:lpstr>
            </vt:variant>
            <vt:variant>
                <vt:i4>1</vt:i4>
            </vt:variant>
        </vt:vector>
    </HeadingPairs>
    <TitlesOfParts>
        <vt:vector size="1" baseType="lpstr">
            <vt:lpstr>Лист 1</vt:lpstr>
        </vt:vector>
    </TitlesOfParts>
    <Company></Company>
    <LinksUpToDate>false</LinksUpToDate>
    <SharedDoc>false</SharedDoc>
    <HyperlinksChanged>false</HyperlinksChanged>
    <AppVersion>14.0300</AppVersion>
</Properties>

Первая строка нам уже знакома.

Во второй строке открывающий тег properties и эта строка похожа на рассмотренную нами ранее.

Третья строка содержит название приложения. В данном случае — Microsoft Excel (что не удивительно). Данную строку лучше не изменять, ибо приложение упадет.

Следующая строка:

<DocSecurity>0</DocSecurity>

Означает безопасность документа и в зависимости от числа имеет следующий посыл:

0 — Документ не защищен

1 — Документ защищен паролем.

2 — Рекомендуется открывать документ только для чтения.

4 — Документ принудительно открыт только для чтения.

8 — Документ заблокирован для заметок.

Строка:

<ScaleCrop>false</ScaleCrop>

указывает режим отображения эскиза документа. Установите для этого элемента значение TRUE, чтобы включить масштабирование эскиза документа на экране. Установите для этого элемента значение FALSE, чтобы включить обрезку эскиза документа, чтобы отображались только те разделы, которые соответствуют отображаемому значению (из документации microsoft).

Далее открывается тег HeadingPairs, внутри которого описаны группы частей документа и количество частей в каждой группе. Эти части являются не частями документа, а концептуальными представлениями разделов документа.

Внутри HeadingPairs мы имеем 1 векторный контент, в котором имеются 2 его части (подробнее о векторах и baseType можно почитать в документации microsoft).

Первая часть означает, что мы описываем листы в книге, а во второй части указываем количество этих листов.

Следующий тег — TitlesOfParts. Он описывает наименования частей документа. в данном случае — названия листов в книге. Здесь также указывается количество частей векторного контента.

В теге Company можно записать название компании.

Следующий элемент — LinksUpToDate — указывает, актуальны ли гиперссылки в документе. Установите для этого элемента значение TRUE, чтобы показать, что гиперссылки обновлены. Установите для этого элемента значение FALSE, чтобы указать, что гиперссылки устарели (из документации microsoft).

Элемент SharedDoc указывает, является ли этот документ в настоящее время общим для нескольких производителей. Если для этого элемента установлено значение TRUE, производителям следует проявлять осторожность при обновлении документа.

HyperlinksChanged указывает, что одна или несколько гиперссылок в этой части были обновлены исключительно в этой части производителем. Следующий производитель, который откроет этот документ, обновит отношения гиперссылок новыми гиперссылками, указанными в этой части.

Тег AppVersion указывает версию используемого приложения Excel при создании файла

Разбор docProps/core.xml

Содержимое файла примерно таково:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <dc:creator>Виктор</dc:creator>
  <dcterms:created xsi:type="dcterms:W3CDTF">2006-09-16T00:00:00Z</dcterms:created>
  <dcterms:modified xsi:type="dcterms:W3CDTF">2006-09-16T00:00:00Z</dcterms:modified>
</cp:coreProperties>

Первая строка нам уже знакома.

Во второй строке открывающий тег cp:coreProperties и эта строка похожа на рассмотренную нами ранее. Внутри него описываются свойства приложения:

dc:creator — Имя создателя документа;

dcterms:created — дата и время создания файла;

dcterms:modified — дата и время последнего изменения файла;

Разбор xl/_rels/workbook.xml.rels

Примерное содержимое файла:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
    <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Target="calcChain.xml"/>
</Relationships>

Этот файл похож на раннее рассмотренный нами, только здесь уже описываются зависимости для файлов, которые используются непосредственно в книге.

Здесь записаны зависимости всех листов в книге, файла со строковыми значениями, цепочками вычислений и прочих файлов (мы разберем эти файлы дальше)

Разбор xl/printerSettings/printerSettings1.bin

Это файл, содержащий код в бинарном виде. Чтобы разобрать этот файл нужно описать много вещей про бинарники, а, чтобы научить писать правильно такой файл, потребуется много сил, времени и много текста. Да и в целом не вижу смысла вам работать с этим файлом. (честно говоря, я сам поверхностно знаком с этой темой).

Разбор xl/theme/theme1.xml

У меня не было надобностей разбирать этот файл, поэтому пока не буду описывать его работу. Но если кому-то понадобится (не знаю зачем) подробный разбор этого файла — я постараюсь сделать это.

Разбор xl/worksheets/_rels/sheet1.xml.rels

Содержимое этого файла может быть следующим:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings" Target="../printerSettings/printerSettings1.bin"/>
</Relationships>

Здесь описана одна зависимость с файлом xl/printerSettings/printerSettings1.bin — настройками для печати.

Разбор xl/worksheets/sheet1.xml

Начинается самое интересное и большое в этой статье.

Начинается такой файл с обычного объявления типа документа xml и некоторых настроек:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
  <dimension ref="A1"/>
  <sheetViews>
    <sheetView tabSelected="1" workbookViewId="0">
      <selection activeCell="J10" sqref="J10"/>
      <pane ySplit="1" topLeftCell="A2" activePane="bottomRight" state="frozen"/>
    </sheetView>
  </sheetViews>
  <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
  <cols>
    <col min="1" max="1" width="12" customWidth="1"/>
    <col min="3" max="5" width="14" customWidth="1"/>
    <col min="6" max="7" width="31" customWidth="1"/>
  </cols>
  <sheetData/>
  <mergeCells count="40">
    <mergeCell ref="G15:I15"/>
    <mergeCell ref="E3:F3"/>
    <mergeCell ref="E4:F4"/>
  </mergeCells>
  <autoFilter ref="A1:N1"/>
  <printOptions headings="1" gridLines="1"/>
  <pageMargins left="0.7" right="0.7" top="0.7" bottom="0.7" header="0.3" footer="0.3"/>
  <pageSetup paperSize="9" pageOrder="overThenDown" orientation="portrait" blackAndWhite="1" draft="1" cellComments="atEnd" errors="NA" r:id="rId1"/>
</worksheet>

Строка третья означает размер экспортируемого диапазона (с какой по какую ячейку находятся данные).

В теге sheetViewselection описывается выделенная клетка (или диапазон клеток).

Атрибут activeCell — активная ячейка, sqref — выделенная ячейка или диапазон ячеек.

такая строка может выглядеть и вот так:

<selection activeCellId="2" sqref="A1:B2 B2:C3 A1:C3"/>

Здесь уже вместо атрибута activeCell стоит activeCellId, потому что в атрибуте sqref мы видим несколько диапазонов. исходя из этого выясняем, что активный диапазон является A1:C3. на изображении ниже показано, как выглядит такой вариант выделения ячеек.

Выделенные ячейки

Выделенные ячейки

Про тег pane, sheetFormatPr и cols хорошо рассказано в статье от @Lachrimae:

Собственно, закрепление строки — тег <pane />. И вот какие здесь использованы атрибуты:

ySplit — показывает количество закрепленных строк. Для закрепления столбцов есть аналогичный атрибут xSplit;

topLeftCell — указание левой верхней ячейки, видимой по умолчанию НЕзакрепленной области;

activePane — указание местонахождения НЕзакрепленной области. В руководствах сказано, что этот атрибут регулирует, с какой стороны будет НЕзакрепленная область. Правда, попробовав разные значения, я почему-то получил одинаковый результат. Как вариант «by default» я для себя выбрал bottomRight;

state — указатель состояния закрепленной области. Для простого закрепления строки используется значение frozen

Тег <sheetFormatPr />. Пример:

<sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>

Интересен нам здесь в основном атрибут defaultRowHeight, то есть высота столбца по умолчанию. Стандартный, привычный нам вариант — 15 у.е. Если назначить его, скажем, 30 у.е., то строки, для которых высота не указана отдельно, станут в 2 раза выше. Однако, для того чтоб применить значение, отличное от дефолтного, необходимо указать атрибут customHeight со значением «true». Выглядит это примерно так:

<sheetFormatPr defaultRowHeight="30" customHeight="true" x14ac:dyDescent="0.25"/>

Тег </cols>. Помогает установить ширину столбцов отличную от дефолтной. В заполненном виде выглядит примерно так:

Вложенные теги </col> обозначают не каждый один столбец, как могло показаться, а группу столбцов, идущих подряд и имеющих единую ширину.

Атрибут min — первый столбец группы;

Атрибут max — последний столбец группы;

Атрибут width — ширина столбца из группы;

Атрибут customWidth — флаг применения кастомной ширины, без него ширина все равно будет дефолтной;

Тег sheetData — описание содержимого ячеек и их настроек.

здесь структура такова:

<sheetData>
  <row r="1" spans="1:5" ht="18" customHeight="1" x14ac:dyDescent="0.25">
    <c r="A1">
      <v>1</v>
    </c>
    <c r="B1" t="s">
      <v>0</v>
    </c>
    <c r="C1" t="s">
      <v>1</v>
    </c>
    <c r="D1" t="s">
      <v>2</v>
    </c>
    <c r="E1">
      <v>1</v>
    </c>
  </row>
  <row r="4" spans="1:5" x14ac:dyDescent="0.25">
    <c r="A4" t="s">
      <v>2</v>
    </c>
    <c r="B4">
      <f>SUM(A1:E1)</f>
      <v>2</v>
    </c>
  </row>
</sheetData>

В Excel это будет выглядеть вот так:

Ячейки с данными

Ячейки с данными

Давайте разбираться, что же все-таки в коде происходит.

Мы видим два тега row — это наши строки. У каждой есть атрибут r — это номер строки. Атрибут spans означает сколько столбцов задействовано, dyDescent — вертикальное расстояние в пикселях между ячейками. Атрибут ht устанавливает высоту всей строки в пунктах, а тег customHeight говорит, что мы используем нестандартную высоту строки.

В теге row есть теги c — это ячейки в строке. у каждого тега есть атрибут r — означающий позицию ячейки. Но атрибут t — присутствует не у всех, потому что запись t=»s» — означает, что у ячейки установлен тип строки, а у кого этого атрибута нет — тип устанавливается стандартный — числовой. Еще у тегов c может присутствовать атрибут s, в котором записывается номер применяемого к ячейке стиля из файла xl/styles.xml (мы доберемся до него позже).

Внутри тегов c есть теги v — это наши значения, записываемые в ячейки. Но не все так просто. Те значения, которые находятся в теге c без атрибута t — те значения записываются без изменений, т.е. записывается в ячейку само число из тега v, а вот те значения, которые находятся в теге c с атрибутом t — уже обрабатываются по-другому: в теге v записан порядковый номер строки в файле xl/sharedStrings.xml (мы доберемся до него позже). В ячейку уже записывается строка, которая имеет порядковый номер, записанный в теге v.

Но мы можем заметить, что одна ячейка имеет помимо тега v еще тег f. Это тег с формулой, в данном случае формула означает: сумма ячеек от A1 до E1. А в теге v записан уже посчитанный ответ. Делать это не обязательно, но если не записать — то при открытии документа excel предложит сохранить изменения, т.к. он сам автоматически посчитал и записал этот результат.

С тегом sheetData разобрались, идем дальше.

Про теги mergeCells и autoFilter снова обратимся к статье от @Lachrimae:

Тег <mergeCells />.

Как мы знаем, в Excel есть возможность объединения ячеек. Все объединенные ячейки на листе перечислены здесь. В заполненном виде тег выглядит примерно так:

<mergeCells count="40">
  <mergeCell ref="G15:I15"/>
  <mergeCell ref="E3:F3"/>
  <mergeCell ref="E4:F4"/>
</mergeCells>

Как видно, одна объединенная ячейка обозначена одним тегом <mergeCell /> с единственным атрибутом ref, задающим диапазон объединения.

Тег <autoFilter />. Фильтры, которые так любят видеть в отчетах наши пользователи. В заполненном виде тег выглядит так:

<autoFilter ref="A1:N1"/>

Нетрудно понять, что атрибут ref задает зону, занимаемую активными ячейками фильтров.

Тег printOptions — параметры печати. Атрибут headings — означает, что будут печататься заголовки, а атрибут gridLines — что будут печататься линии сетки.

Тег pageMargins задает поля сверху, снизу, справа, слева, у заголовков и у подвала для печатаемой страницы.

Тег pageSetup предпочтительные настройки бумаги, опять же, для печати.

Атрибут paperSize — устанавливает размер бумаги.

Используемые значения:

Значение

Описание

16

10 в. x 14 в.

17

11 в. x 17 в.

8

A3 (297 мм x 420 мм)

9

A4 (210 мм x 297 мм)

10

A4 Small (210 мм x 297 мм)

11

A5 (148 мм x 210 мм)

12

B4 (250 мм x 354 мм)

13

A5 (148 мм x 210 мм)

24

Лист размеров C

25

Лист размеров D

20

Конверт #10 (4-1/8 в. x 9-1/2 в.)

21

Конверт #11 (4-1/2 в. x 10-3/8 in.)

22

Конверт #12 (4-1/2 в. x 11 in.)

23

Конверт #14 (5 в. x 11-1/2 в.)

19

Конверт #9 (3-7/8 в. x 8-7/8 in.)

33

Конверт B4 (250 мм x 353 мм)

34

Конверт B5 (176 мм x 250 мм)

35

Конверт B6 (176 мм x 125 мм)

29

Конверт C3 (324 мм x 458 мм)

30

Конверт C4 (229 мм x 324 мм)

28

Конверт C5 (162 мм x 229 мм)

31

Конверт C6 (114 мм x 162 мм)

32

Конверт C65 (114 мм x 229 мм)

27

DL конверта (110 мм x 220 мм)

36

Конверт (110 мм x 230 мм)

37

Envelope Monarch (3-7/8 in. x 7-1/2 in.)

38

Конверт (3-5/8 в. x 6-1/2 in.)

26

Лист размеров E

7

Executive (7-1/2 в. x 10-1/2 in.)

41

Немецкий юридический фанфолд (8-1/2 в. x 13 in.)

40

Немецкий юридический фанфолд (8-1/2 в. x 13 in.)

39

Стандартный фанфолд США (14-7/8 в. x 11 in.)

14

Фолио (8-1/2 в. x 13 in.)

4

Книга (17 в. x 11 in.)

5

Юридический (8-1/2 в. x 14 in.)

1

Письмо (8-1/2 в. x 11 in.)

2

Letter Small (8-1/2 in. x 11 in.)

18

Примечание (8-1/2 в. x 11 in.)

15

Quarto (215 мм x 275 мм)

6

Заявление (5-1/2 в. x 8-1/2 in.)

3

Таблоид (11 в. x 17 in.)

256

Пользовательский

Атрибут pageOrder — направление печати. Если значение «overThenDown» — то будет печататься слева направо, потом нижняя часть снова слева направо и т.д. Если такого атрибута нет — то печататься будет сначала вся левая сторона сверху-вниз, потом та часть, что справа и т.д.

Атрибут orientation — задает ориентацию листов. «portrait» — портретная (вертикальная) ориентация, «landscape» — альбомная (горизонтальная) ориентация.

Атрибут blackAndWhite — если установлена 1 ил true — лист будет напечатан в черно-белом варианте.

Атрибут draft — если установлена 1 ил true — лист будет напечатан без графики.

Атрибут cellComments — печать комментариев к ячейкам. Используемые значения:

  • AsDisplayed — Распечатать Комментарии Как отображается;

  • AtEnd — Печать в конце;

  • None — Не печатать.

Атрибут errors Печать обработки ошибок.

  • Blank Показать ошибки ячейки как пустые;

  • Dash — Ошибки ячейки Dash;

  • Displayed — Отображение ошибок ячейки;

  • NA — Отображает «NA».

Атрибут r:id — идентификатор настроек.

Разбор xl/caclChain.xml

По традиции, начнем с содержимого файла:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<calcChain xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <c r="B4" i="1"/>
</calcChain>

Здесь нам важна строка 3. видим тег c — наша ячейка, у нее есть атрибут r — адрес ячейки. Индексный атрибут i указывает индекс листа, с которым связана ячейка.

Разбор xl/sharedStrings.xml

Обратимся к статье от @Lachrimae:

Представим, что у нас есть таблица, заполненная строковыми данными, и что она большая. При этом крайне маловероятно, что все значения в ней будут уникальны. Некоторые из них нет-нет, да повторятся где-нибудь в разных частях таблицы. Хранить такой массив «как есть» внутри XML-разметки листа нерационально с точки зрения ресурсов ПК. Поэтому все строковые значения вынесены в отдельный файл, /xl/sharedStrings.xml. Часть его, которая нас интересует, выглядит, допустим, так:

<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="4" uniqueCount="3">
    <si><t>Вася</t></si>
    <si><t>Петя</t></si>
    <si><t>Саша</t></si>
</sst>

Обратите внимание на атрибуты тега <sst /> «count» и «uniqueCount»: их значения различаются. Дело в том, что в книге одну из строк я использовал дважды. При этом атрибуты не обязательны, то есть если их убрать, то Excel ошибки не выдаст, но при сохранении файла нарисует опять.

Здесь же можно сказать, что здесь, внутри тега <si /> можно играть с настройками шрифта. Для этого используется доработанная напильником система пробегов, применяемая в MS Word (до него мы еще доберемся). Выглядит это примерно так:

    <si>
        <r>
            <t xml:space="preserve">Мама </t>
        </r>
        <r>
            <rPr>
                <b/>
            </rPr>
            <t>мыла</t>
        </r>
        <r>
            <rPr>
                <sz val="18"/>
            </rPr>
            <t xml:space="preserve"> раму</t>
        </r>
    </si>

Обратите внимание: в корневой тег <si/> в предыдущем примере был встроен непосредственно тег <t/>, содержавший текст. Здесь же он обернут тегом <r/>, то есть Run; по-русски его принято назвать «пробег». Пробег — это, если в двух словах — кусок текста, имеющий одинаковые стилевые настройки.

В этом примере строковое значение содержит 3 пробега. Чтобы было удобнее их рассматривать, я, пожалуй, вынесу их отдельными сорсами.

Первый:

<r>
    <t xml:space="preserve">Мама </t>
</r>

Этот пробег не содержит секции <rPr/>, поэтому использует стилевые настройки ячейки, в которой находится. В нем интересно другое: атрибут xml:space=«preserve». Дело в том, что по умолчанию что Excel, что Word обрезают концевые пробелы со всех пробегов. Может показаться, что в этом случае в месте стыка пробегов всегда должна получаться примерно такая картина: «ВасяПетя». Но по опыту общения с тем же MS Word мы знаем, что это не так. Из-за чего? Вот как раз из-за xml:space=«preserve».

Второй:

<r>
    <rPr>
        <b/>
    </rPr>
    <t>мыла</t>
</r>

Здесь нет атрибута xml:space=«preserve». Нам без разницы, что Excel сделает с концевыми пробелами, которых нет. Зато есть блок <rPr/>. В принципе, в него можно поместить любые настройки шрифта, которые только есть в Excel. Я же сделал всего один, чтобы не раздувать объем примера.

Третий:

<r>
    <rPr>
        <sz val="18"/>
    </rPr>
    <t xml:space="preserve"> раму</t>
</r>

А здесь у нас есть и блок настроек шрифта, и сохранение концевых пробелов.

Ну и еще коротенькая ремарка. Если есть необходимость сделать многострочную запись в ячейке, то здесь в строке просто будет обычный символ переноса, chr(10). Сам атрибут многострочности ячейки расположен в файле разметки листа. В однострочной ячейке символ переноса будет проигнорирован. Excel просто сделает вид, что его нет.

Добавлю: каждый тег si имеет порядковый номер, начиная с 0. Он нигде не записывается. Этот номер и записывается в файле xl/worksheets/sheet1.xml в теге sheetData, который мы рассматривали ранее.

Разбор xl/styles.xml

Снова обратимся к статье от @Lachrimae. Буду добавлять от себя дополнительную информацию.

Как нетрудно догадаться, здесь хранится информация об оформлении ячеек. Причем в угоду оптимизации, хранится она в достаточно интересном виде. Файл состоит из следующих секций:

1. Шрифты:

<fonts count="2" x14ac:knownFonts="1">
    <font>
        <sz val="11"/>
        <color theme="1"/>
        <name val="Calibri"/>
        <family val="2"/>
        <scheme val="minor"/>
    </font>
    <font>
        <b/>
        <sz val="11"/>
        <color theme="1"/>
        <name val="Calibri"/>
        <family val="2"/>
        <charset val="204"/>
        <scheme val="minor"/>
    </font>
</fonts>

Как можно понять, здесь перечислены только уникальные стили оформления текста, использованные в книге. Каждый тег — один стиль. Вложенные теги — особенности стиля, такие как полужирное написание (тег <b/>), кегль (<sz/>) и другие.

На месте тега <b/> можно написать:

  • <i/> — курсив;

  • <u/> — подчеркнутый,
    либо <u val=»double»/> — двойное подчеркивание;

  • <strike/> — зачеркнутый;

  • <vertAlign val=»superscript»/> — надстрочный текст,
    либо <vertAlign val=»subscript»/> — подстрочный текст;

либо сочетание нескольких тегов.

Если хотите установить цвет шрифта какой-нибудь свой (возьмем #123456), то в теге color вместо атрибута theme пишем rgb и вставляем hex-код цвета, должно получиться вот так:

<color rgb="123456"/>

2. Заливка ячеек:

<fills count="2">
    <fill>
        <patternFill patternType="none"/>
    </fill>
    <fill>
        <patternFill patternType="gray125"/>
    </fill>
</fills>

Как видно, первый вариант — без заливки вообще, а второй — сплошная заливка библиотечного цвета «gray125».

Здесь тот же принцип с установкой своего цвета, только немного по-другому записывается:

<fill>
	<patternFill patternType="solid">
    <fgColor rgb="123456"/>
    <bgColor indexed="64"/>
  </patternFill>
</fill>

Тег fgcolor — отвечает за цвет переднего плана, а bgcolor — за цвет заднего плана (indexed=»64″ — черный цвет).

У тега patternFill атрибут patternType может иметь следующие значения:

  • none — Нет заливки;

  • solid — Сплошная заливка; (пример выше)

  • darkGray — Серый 75%;

    Пример

    <fill>
        <patternFill patternType="darkGray">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

    Здесь мы можем наблюдать, что цвета расположены в сетку

  • mediumGray — Серый 50%;

    Пример

    <fill>
        <patternFill patternType="mediumGray">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

    Здесь сетка уже поменьше и цвет из тега fgcolor уже меньше прорисовывается.

  • lightGray — Серый 25%;

    Пример

    <fill>
        <patternFill patternType="lightGray">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

    Здесь сетка еще меньше и цвет из тега fgcolor еще меньше прорисовывается.

  • gray125 — Серый 12.5%;

    Пример

    <fill>
        <patternFill patternType="gray125">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

    Посыл, думаю, понятен

  • gray0625 — Серый 0.025%

    Пример

    <fill>
        <patternFill patternType="gray0625">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • darkHorizontal — Полосатый цвет с горизонтальными линиями;

    Пример

    <fill>
        <patternFill patternType="darkHorizontal">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • darkVertical — Полосатый цвет с вертикальными линиями;

    Пример

    <fill>
        <patternFill patternType="darkVertical">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • darkDown — Полосатый цвет с диагональными линиями сверху-вниз;

    Пример

    <fill>
        <patternFill patternType="darkDown">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • darkUp — Полосатый цвет с диагональными линиями снизу-вверх;

    Пример

    <fill>
        <patternFill patternType="darkUp">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • darkGrid — Диагональный клетчатый;

    Пример

    <fill>
        <patternFill patternType="darkGrid">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

    В этом варианте сетки четко видно, клетки цветов одинаковые и их поровну. Как шахматная доска

  • darkTrellis — Толстый диагональный клетчатый;

    Пример

    <fill>
        <patternFill patternType="darkTrellis">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightHorizontal — Полосатый цвет с горизонтальными тонкими линиями;

    Пример

    <fill>
        <patternFill patternType="lightHorizontal">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightVertical — Полосатый цвет с вертикальными тонкими линиями;

    Пример

    <fill>
        <patternFill patternType="lightVertical">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightDown — Полосатый цвет с диагональными тонкими линиями сверху-вниз;

    Пример

    <fill>
        <patternFill patternType="lightDown">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightUp — Полосатый цвет с диагональными тонкими линиями снизу-вверх;

    Пример

    <fill>
        <patternFill patternType="lightUp">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightGrid — Тонкий горизонтальный клетчатый;

    Пример

    <fill>
        <patternFill patternType="lightGrid">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки
  • lightTrellis — Тонкий диагональный клетчатый;

    Пример

    <fill>
        <patternFill patternType="lightTrellis">
        <fgColor rgb="FF0000"/>
        <bgColor rgb="00FF00"/>
      </patternFill>
    </fill>

    Цвет выглядит вот так:

    Цвет ячейки

    Цвет ячейки

Можно еще заливку сделать градиентом:

  • Горизонтальный, вертикальный, диагональный:

    Примеры

    2 цвета:

    <fill>
    	<gradientFill degree="90">
        <stop position="0">
          <color rgb="0000FF"/>
        </stop>
        <stop position="1">
          <color rgb="FFFFFF"/>
        </stop>
      </gradientFill>
    </fill>

    градиент 2 цвета

    градиент 2 цвета

    Атрибут degree — угол поворота, изменяя который можно менять направление градиента.

    3 цвета:

    <fill>
    	<gradientFill degree="90">
        <stop position="0">
          <color rgb="0000FF"/>
        </stop>
        <stop position="0.5">
          <color rgb="FFFFFF"/>
        </stop>
        <stop position="1">
          <color rgb="FF0000"/>
        </stop>
      </gradientFill>
    </fill>

    Градиент 3 цвета

    Градиент 3 цвета
  • От угла:

    Примеры

    От левого верхнего угла

    <fill>
      <gradientFill type="path">
        <stop position="0">
        	<color rgb="0000FF"/>
        </stop>
        <stop position="1">
        	<color rgb="FFFFFF"/>
        </stop>
      </gradientFill>
    </fill>

    Градиент от угла

    Градиент от угла

    От правого верхнего угла — в тег gradientFill добавить атрибуты left=»1″ right=»1″, чтобы получилось:

    <gradientFill left="1" right="1" type="path">

    От левого нижнего угла — в тег gradientFill добавить атрибуты bottom=»1″ top=»1″;

    От правого нижнего угла — в тег gradientFill добавить атрибуты bottom=»1″ top=»1″ left=»1″ right=»1″;

  • От центра:

    <fill>
      <gradientFill bottom="0.5" top="0.5" right="0.5" left="0.5" type="path">
        <stop position="0">
        	<color rgb="0000FF"/>
        </stop>
        <stop position="1">
        	<color rgb="FFFFFF"/>
        </stop>
      </gradientFill>
    </fill>

    Градиент от центра

    Градиент от центра

3. Границы:

<borders count="2">
    <border>
        <left/>
        <right/>
        <top/>
        <bottom/>
        <diagonal/>
    </border>
    <border>
        <left style="thin">
            <color indexed="64"/>
        </left>
        <right style="thin">
            <color indexed="64"/>
        </right>
        <top style="thin">
            <color indexed="64"/>
        </top>
        <bottom style="thin">
            <color indexed="64"/>
        </bottom>
        <diagonal/>
    </border>
</borders>

Как видно, одно наименование здесь состоит из пяти элементов, 4 основных границы и диагональная, то есть все то, что можно настроить через GUI самого Excel.

Атрибут style означает стиль границы и может иметь следующие значения:

  • thin – тонка сплошная;

  • hair – мелкая пунктирная;

  • dotted – точечная пунктирная;

  • dashed – пунктирная линия;

  • dashDot – пунктир линия точка;

  • dashDotDot – пунктир линия точка точка;

  • double – двойная сплошная;

  • medium – сплошная средней толщины;

  • mediumDashed – пунктирная линия средней толщины;

  • mediumDashDot – пунктир линия точка средней толщины;

  • mediumDashDotDot – пунктир линия точка точка средней толщины;

  • slantDashDot – косая пунктир линия точка средней толщины;

  • thick – сплошная большой толщины.

Для установки цвета границы используйте уже известную нам запись:

<color rgb="123FFF"/>

Чтобы установить диагональную границу, нужно в тег diagonal записать атрибуты:

  • diagonalDown=»1″ — для границы сверху-вниз;

  • diagonalUp=»1″ — для границы снизу вверх.

Должно получиться:

<diagonal diagonalDown="1"/>
<diagonal diagonalUp="1"/>
<diagonal diagonalDown="1" diagonalUp="1"/>

Ну и не забудьте внутри тега diagonal записать цвет для границы — тег color.

4. Стили ячеек:

<cellXfs count="4">
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
    <xf numFmtId="0" fontId="1" fillId="0" borderId="0" xfId="0" applyFont="1" applyAlignment="1">
        <alignment wrapText="1"/>
    </xf>
    <xf numFmtId="0" fontId="0" fillId="0" borderId="1" xfId="0" applyBorder="1" applyAlignment="1">
        <alignment horizontal="center" vertical="center"/>
    </xf>
    <xf numFmtId="0" fontId="1" fillId="2" borderId="1" xfId="0" applyFont="1" applyFill="1" applyBorder="1" applyAlignment="1">
        <alignment horizontal="center" vertical="center"/>
    </xf>
</cellXfs>

А вот здесь надо объяснить подробнее. Когда в файле листа мы будем указывать стиль ячейки, мы будем ссылаться как раз на эту секцию. Каждый тег <xf />, представляющий собой один стиль, является собранием ссылок на предыдущие секции, то есть он сам по себе не содержит объявления шрифта, границ и заливки. Рассмотрим интересные атрибуты ближе:

numFmtId — указание формата текста в ячейке (дата, валюта, число, текст, …). Полный перечень этих типов есть здесь

fontId, fillId, borderId — ссылка на шрифт/заливку/границы (см. секцию 1, 2 и 3 соответственно). Нумерация начинается с 0.

— applyFont, applyFill, applyBorder — указание на то, что при оформлении этой ячейки вообще используется кастомный шрифт/заливка/границы. По умолчанию 0, так что можно не указывать вообще, как видно на примере в элементе #0.

applyAlignment — указание на то, что выравнивание текста в ячейке будет отличаться от стандартного. По умолчанию 0, но если указано «1», то в родительский тег <xf /> встраивается тег <alignment />, как видно на примере начиная с #1.

В теге alignment могут быть атрибуты:

  • horizontal — выравнивание текста в горизонтальной плоскости. Может иметь значения: left – по левому краю, center – по центру, right – по правому краю, justify – по ширине, fill — заполнение, distributed – распределенное

  • vertical — выравнивание текста по вертикали. Значения: top – по верхнему краю, center – по центру, bottom – по нижнему краю, justify – по высоте, distributed – распределенное

  • textRotation — угол поворота текста. Если установить 255 — то текст будет вертикальный.

  • wrapText=»1″ — перенос текста

Разбор xl/workbook.xml

Из статьи от @Lachrimae:

Основное его назначение — манифест, то есть перечень листов, из которых наша книга Excel, собственно, и состоит.
Выглядит этот перечень, к примеру, так:

<sheets>
    <sheet name="Лист1" sheetId="1" r:id="rId1"/>
    <sheet name="Лист2" sheetId="2" r:id="rId2"/>
    <sheet name="Лист3" sheetId="3" r:id="rId3"/>
    <sheet name="Лист4" sheetId="4" r:id="rId4"/>
</sheets>

Это значит, что в книге 4 листа, и их имена указаны в атрибутах name. Каждому тегу должен соответствовать файл в папке %file%/xl/worksheets. Excel сам знает, как должны называться эти файлы и при попытке их переименовать, сочтет всю книгу поврежденной.

Разбор [Content_Types].xml

Содержимое файла может быть следующим:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings" Extension="bin"/>
  <Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
  <Default ContentType="application/xml" Extension="xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" PartName="/xl/workbook.xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" PartName="/xl/worksheets/sheet1.xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.theme+xml" PartName="/xl/theme/theme1.xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" PartName="/xl/styles.xml"/>
  <Override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/docProps/core.xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" PartName="/docProps/app.xml"/>
  <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" PartName="/xl/sharedStrings.xml"/>
	<Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml" PartName="/xl/calcChain.xml"/>
</Types>

В этом файле прописываются определения типов всех файлов и их расположения.

Как видно, здесь записываются все файлы листов, стилей, строковых значений, формул и т.д.

Если в документе вы не используете, к примеру, формул, то строки 13 не будет записано.

Завершение

Я разобрал основные моменты содержания файла excel. Если вам будет интересно узнать про диаграммы и другие возможности excel — пишите в комментариях, я постараюсь сделать дополнение к этой статье из ваших просьб.

Каждому человеку свойственно ошибаться. Если я чего-любо не раскрыл или раскрыл не полностью, либо с ошибками — поправьте меня.

Если вам также будет интересно — напишу статью, как манипулировать с файлами excel посредством PHP/Java/Ruby.

Спасибо за внимание и уделенное время этой статье.

Разобрать файл Excel и извлечь данные с помощью любого современного браузера

Loading…

Обработка Пожалуйста, подождите…

Копировать ссылку

copy link


send to email

Обработка Пожалуйста, подождите…

Файл отправлен на

clear email

Ваше мнение важно для нас, пожалуйста, оцените это приложение.





Спасибо за оценку нашего приложения!

Excel parser

Excel Parser – это бесплатный инструмент, который позволяет извлекать текст и таблицы из Excel файлов, управлять содержимым документов без установки дополнительного программного обеспечения, из любого браузера и с любого устройства. Извлекайте текст из XLS, XLSX, PPT, PPTX, PDF, DOC, DOCX, RTF, HTML, EPUB и многих других форматов файлов и документов.

youtube

Скоро будет

Как Разобрать Excel

  1. Щелкните внутри области перетаскивания или перетащите файл.
  2. Дождитесь завершения загрузки и обработки.
  3. После завершения загрузки и обработки файла вы увидите страницу результатов.
  4. На странице результатов нажмите кнопку «Синтаксический анализ», чтобы начать анализ вашего файла.
  5. Вы также можете поделиться своим файлом с помощью ссылки для копирования или электронной почты.

How to

часто задаваемые вопросы

Q: Как разобрать файл Excel?

A: Во-первых, вам нужно загрузить файл: перетащите файл или щелкните внутри области загрузки, чтобы выбрать файл, чтобы начать его обработку. После завершения обработки нажмите кнопку «Разобрать», чтобы начать анализ вашего документа.

Q: Нужно ли мне устанавливать дополнительное программное обеспечение, чтобы иметь возможность анализировать файл Excel?

A: Нет, приложение для анализа документов Conholdate — это полностью облачная служба, которая не требует установки дополнительного программного обеспечения.

Q: Могу ли я анализировать файлы в ОС Linux, Mac или Android?

A: Конечно, Conholdate Parser — это полностью облачный сервис, который не требует установки какого-либо программного обеспечения и может использоваться в любой операционной системе с веб-браузером.

Q: Безопасно ли анализировать файлы Excel с помощью бесплатного Conholdate.App?

A: Да, это абсолютно безопасно. Ваши файлы хранятся на нашем защищенном сервере и защищены от любого несанкционированного доступа. Через 24 часа все файлы удаляются безвозвратно.

Q: Можно ли разобрать текст из документа Excel?

A: Да, выберите инструмент текстового поля на верхней панели инструментов синтаксического анализатора Excel, выберите нужную область на странице документа Excel и нажмите кнопку синтаксического анализа.

Q: Могу ли я разобрать таблицу из документа Excel?

A: Да, выберите инструмент таблицы на верхней панели инструментов синтаксического анализатора Excel, выберите таблицу на странице документа Excel и нажмите кнопку синтаксического анализа.

Q: Как получить Excel результатов синтаксического анализа?

A: Вы можете загрузить результаты в виде файла CSV, нажав кнопку загрузки, расположенную в верхней части диалогового окна анализатора Excel. Также вы можете сохранить шаблон синтаксического анализа для дальнейшего использования, для этого просто щелкните значок загрузки, расположенный в верхней правой части панели инструментов синтаксического анализатора.

Еще приложений

Еще parser приложений

Выбрать язык

Добавить это приложение в закладки

Нажмите Ctrl + D, чтобы добавить эту страницу в избранное, или Esc, чтобы отменить действие.

Отправьте ссылку для скачивания на

Отправьте нам свой отзыв

Ой! Произошла ошибка.

Недопустимый файл. Убедитесь, что загружается правильный файл.

Ошибка успешно зарегистрирована.


Вы успешно сообщили об ошибке. Вы получите уведомление по электронной почте, когда ошибка будет исправлена.

Нажмите эту ссылку, чтобы посетить форумы.

Немедленно удалите загруженные и обработанные файлы.

Вы уверены, что хотите удалить файлы?

Введите адрес

Структура файла excel

parrow

Дата: Пятница, 08.08.2014, 16:03 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Всем дорого времени суток! Как разобрать файл типа excel на части? Я читал, что он является архивным документом и цель — получение дерева файлов из которого сделан excel.

Сообщение отредактировал parrowПятница, 08.08.2014, 16:03

 

Ответить

ArkaIIIa

Дата: Пятница, 08.08.2014, 16:09 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 894


Репутация:

115

±

Замечаний:
0% ±


2010

Epic!

 

Ответить

_Boroda_

Дата: Пятница, 08.08.2014, 16:13 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Для форматов xlsx, xlsm
переименовываете файл — ставите расширение zip (например) и открываете архив


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Hugo

Дата: Пятница, 08.08.2014, 16:14 |
Сообщение № 4

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

«типа excel» в общем не является архивом.
А вот xlsx/xlsm можете открыть архиватором и полюбопытствовать.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

parrow

Дата: Пятница, 08.08.2014, 16:25 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Для форматов xlsx, xlsm
переименовываете файл — ставите расширение zip (например) и открываете архив

А как поступать с более ранними версиями?(не пересохранять)

Сообщение отредактировал parrowПятница, 08.08.2014, 16:31

 

Ответить

Hugo

Дата: Пятница, 08.08.2014, 16:32 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

А как поступать с более ранними версиями?

Использовать по назначению.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

parrow

Дата: Пятница, 08.08.2014, 16:52 |
Сообщение № 7

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Использовать по назначению.

Как выдернуть из файла изображение в нужном порядке? Или как понять логику имен при сохранение в веб документ?

 

Ответить

paramedic

Дата: Пятница, 08.08.2014, 17:12 |
Сообщение № 8

Группа: Проверенные

Ранг: Участник

Сообщений: 67


Репутация:

6

±

Замечаний:
0% ±


Excel 2007


Я не ламер — я честный чайник

 

Ответить

parrow

Дата: Пятница, 08.08.2014, 17:20 |
Сообщение № 9

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Наверно надо быть менее тупым
[moder]Заблокирован за грубость

Сообщение отредактировал Serge_007Четверг, 25.06.2015, 09:08

 

Ответить

paramedic

Дата: Пятница, 08.08.2014, 17:26 |
Сообщение № 10

Группа: Проверенные

Ранг: Участник

Сообщений: 67


Репутация:

6

±

Замечаний:
0% ±


Excel 2007

Наверно надо быть менее тупым

Решение задачи

получение дерева файлов из которого сделан excel

через проприетарный бинарный формат, не имеющий в структуре никаких файлов — это, наверно, верх ясности мысли и постановки задачи hands


Я не ламер — я честный чайник

Сообщение отредактировал paramedicПятница, 08.08.2014, 17:27

 

Ответить

Alex_ST

Дата: Суббота, 09.08.2014, 20:50 |
Сообщение № 11

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Не только 2007 и старше, но и файлы Excel-2003 прекрасно расковыривает супер-архиватор 7-Zip
А если нужно просто из файла выдернуть медиафайлы, то с этим успешно справляется MultiExtractor



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

9 ответов

Ниже функция преобразует данные в формате Excel (формат XLSX) в JSON. вы можете добавить обещание функции.

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script>
var ExcelToJSON = function() {

  this.parseExcel = function(file) {
    var reader = new FileReader();

    reader.onload = function(e) {
      var data = e.target.result();
      var workbook = XLSX.read(data, {
        type: 'binary'
      });

      workbook.SheetNames.forEach(function(sheetName) {
        // Here is your object
        var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
        var json_object = JSON.stringify(XL_row_object);
        console.log(json_object);

      })

    };

    reader.onerror = function(ex) {
      console.log(ex);
    };

    reader.readAsBinaryString(file);
  };
};
</script>

Ниже столбца есть код для формата XLS Excel в JSON код javascript?

Peru
07 май 2016, в 02:23

Поделиться

Старый вопрос, но я должен отметить, что общая задача разбора файлов XLS из javascript является утомительной и трудной, но не невозможной.

У меня есть основные парсеры, реализованные в чистом JS:

  • http://oss.sheetjs.com/js-xls/ (файлы XLS, что вы хотели)
  • http://oss.sheetjs.com/js-xlsx/ (файлы XLSX/XLSM/XLSB)

Обе страницы — это синтаксические анализаторы XLS/XLSX, основанные на API файлов HTML5 (вы можете перетаскивать свой файл и распечатывать данные в ячейках в списке, разделенном запятыми). Вы также можете создавать объекты JSON (если первая строка является строкой заголовка).

В тестовом пакете http://oss.sheetjs.com/ показана версия, использующая XHR для получения и анализа файлов.

SheetJS
23 июнь 2013, в 08:36

Поделиться

Этот код может помочь вам. Большую часть времени jszip.js не работает, поэтому включите xlsx.full.min.js в свой js-код.

Код HTML

 <input type="file" id="file" ng-model="csvFile"  
    onchange="angular.element(this).scope().ExcelExport(event)"/>

Javascript

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.10.8/xlsx.full.min.js">
</script>

$scope.ExcelExport= function (event) {


    var input = event.target;
    var reader = new FileReader();
    reader.onload = function(){
        var fileData = reader.result;
        var wb = XLSX.read(fileData, {type : 'binary'});

        wb.SheetNames.forEach(function(sheetName){
        var rowObj =XLSX.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);
        var jsonObj = JSON.stringify(rowObj);
        console.log(jsonObj)
        })
    };
    reader.readAsBinaryString(input.files[0]);
    };

afzalriz304
14 июль 2017, в 06:23

Поделиться

Загрузите excel file здесь, и вы можете получить данные в формате JSON в console:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    var ExcelToJSON = function() {

      this.parseExcel = function(file) {
        var reader = new FileReader();

        reader.onload = function(e) {
          var data = e.target.result;
          var workbook = XLSX.read(data, {
            type: 'binary'
          });
          workbook.SheetNames.forEach(function(sheetName) {
            // Here is your object
            var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
            var json_object = JSON.stringify(XL_row_object);
            console.log(JSON.parse(json_object));
            jQuery( '#xlx_json' ).val( json_object );
          })
        };

        reader.onerror = function(ex) {
          console.log(ex);
        };

        reader.readAsBinaryString(file);
      };
  };

  function handleFileSelect(evt) {
    
    var files = evt.target.files; // FileList object
    var xl2json = new ExcelToJSON();
    xl2json.parseExcel(files[0]);
  }


 
</script>

<form enctype="multipart/form-data">
    <input id="upload" type=file  name="files[]">
</form>

    <textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea>

    <script>
        document.getElementById('upload').addEventListener('change', handleFileSelect, false);

    </script>

Это комбинация следующих сообщений Stackoverflow:

  1. https://stackoverflow.com/questions/8238407/how-to-parse-excel-file-in-javascript-html5
  2. https://stackoverflow.com/questions/16505333/get-the-data-of-uploaded-file-in-javascript

Удачи…

Akash
18 окт. 2018, в 09:33

Поделиться

Если вы хотите самый простой и крошечный способ чтения файла *.xslx в браузере, то эта библиотека может сделать:

https://catamphetamine.github.io/read-excel-file/

<input type="file" id="input" />
import readXlsxFile from 'read-excel-file'

const input = document.getElementById('input')

input.addEventListener('change', () => {
  readXlsxFile(input.files[0]).then((data) => {
    // 'data' is an array of rows
    // each row being an array of cells.
  })
})

В приведенном выше примере data являются необработанными строковыми данными. Его можно проанализировать в JSON со строгой схемой, передав аргумент schema. См. API документы для примера этого.

Документы по API: http://npmjs.com/package/read-excel-file

asdfasdfads
21 март 2018, в 04:46

Поделиться

включают xslx.js, xlsx.full.min.js, jszip.js

добавить обработчик события onchange в файл ввода

function showDataExcel(event)
{
            var file = event.target.files[0];
            var reader = new FileReader();
            var excelData = [];
            reader.onload = function (event) {
                var data = event.target.result;
                var workbook = XLSX.read(data, {
                    type: 'binary'
                });

                workbook.SheetNames.forEach(function (sheetName) {
                    // Here is your object
                    var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);

                    for (var i = 0; i < XL_row_object.length; i++)
                    {
                        excelData.push(XL_row_object[i]["your column name"]);

                    }

                    var json_object = JSON.stringify(XL_row_object);
                    console.log(json_object);
                    alert(excelData);
                })

            };

            reader.onerror = function (ex) {
                console.log(ex);
            };

            reader.readAsBinaryString(file);

}

vsnahar
10 май 2018, в 12:31

Поделиться

Если вам интересно, как прочитать файл с сервера, этот код может быть полезен.

Ограничения:

  1. Файл должен быть на сервере (локальный/удаленный).
  2. Вам нужно будет настроить заголовки или использовать плагин CORS Google.
<Head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script lang="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.12.4/xlsx.core.min.js"></script>
</head>

<body>
    <script>
    /* set up XMLHttpRequest */


    // replace it with your file path in local server
    var url = "http://localhost/test.xlsx";

    var oReq = new XMLHttpRequest();
    oReq.open("GET", url, true);
    oReq.responseType = "arraybuffer";

    oReq.onload = function(e) {
        var arraybuffer = oReq.response;

        /* convert data to binary string */
        var data = new Uint8Array(arraybuffer);

        var arr = new Array();
        for (var i = 0; i != data.length; ++i) {
            arr[i] = String.fromCharCode(data[i]);
        }

        var bstr = arr.join("");

        var cfb = XLSX.read(bstr, { type: 'binary' });

        cfb.SheetNames.forEach(function(sheetName, index) {

            // Obtain The Current Row As CSV
            var fieldsObjs = XLS.utils.sheet_to_json(cfb.Sheets[sheetName]);

            fieldsObjs.map(function(field) {
                $("#my_file_output").append('<input type="checkbox" value="' + field.Fields + '">' + field.Fields + '<br>');
            });

        });
    }

    oReq.send();
    </script>
</body>
<div id="my_file_output">
</div>

</html>

Vijay Reddy
12 март 2018, в 05:53

Поделиться

XLS — это двоичный собственный формат, используемый Microsoft. Разбор XLS с серверными языковыми языками очень затруднен без использования какой-либо определенной библиотеки или Office Interop. Выполнение этого с помощью javascript невозможно. Благодаря API-интерфейсу HTML5 вы можете прочитать его двоичное содержимое, но для его анализа и интерпретации вам нужно будет погрузиться в спецификации формата XLS. Начиная с Office 2007, Microsoft обняла форматы Open XML (xslx для Excel), который является стандартом.

Darin Dimitrov
23 нояб. 2011, в 07:15

Поделиться

var excel = новый объект ActiveXObject ( «Excel.Application» );
var book = excel.Workbooks.Open(your_full_file_name_here.xls);
var sheet = book.Sheets.Item(1);
var value = sheet.Range( «A1» );

когда у вас есть лист. Вы можете использовать функции VBA, как и в Excel.

i100
23 нояб. 2011, в 07:34

Поделиться

Ещё вопросы

  • 1Можно ли написать сайт ASP .NET, который позвонит по номеру телефона по скайпу или альтернативный
  • 0GetOpt Long распознает Verbose
  • 1Таргетинг только на новые добавленные элементы, помещенные в массив
  • 1DataFrame Pandas объединяет неожиданные значения
  • 0Как проверить состояние наведения в JQuery?
  • 1хотите начать деятельность после завершения анимации просмотра изображения
  • 0Как заставить браузер разбивать текст, где это возможно?
  • 1как отправить cookie и перенаправить одновременно в ответ? (безсерверный фреймворк)
  • 0Чтение строки после определенного слова, извлечение строки до символа, а затем сохранение ее в массив
  • 0Директива Enter as tab не работает с полем ввода, созданным с помощью ng-repeat
  • 0Вставить пост в Facebook с Angular
  • 0MySQL фильтр нулевая сумма
  • 1Как получить доступ к определенному свойству из локального объекта хранения? (Angular 2 / Angular-2-Local-Storage)
  • 1Проверка паролей через Hascode
  • 0Как установить контейнер с правой стороны для прокрутки на своем месте?
  • 0Как включить MySQL с PHP 7
  • 1ReactJs Todo List push Состояние
  • 0Получить первое значение от JSON
  • 1Встраивание Jetty 9 с использованием ServletContext
  • 0Как написать конструктор копирования?
  • 1Для миграций EF нужен ctor по умолчанию, однако я не знаю строку подключения?
  • 1Получите общие значения в нескольких группах в pandas Dataframe
  • 1C # несколько Contentpresenter на кнопку стиля (Windows 8.1)
  • 1Как получить значение из текстового поля по имени, которое является динамическим
  • 1включая ресурс вместо его местоположения
  • 1Python Pandas — Lambda применяют сохранить первоначальный формат
  • 0Где я могу найти список шаблонов телефонных номеров PCRE для номеров в США?
  • 0Как включить одну HTML-страницу (в качестве заголовка) в другую HTML-страницу?
  • 1Bluetooth Discovery против подключения
  • 0Передача переменной количества аргументов в функцию
  • 1Python — ошибка обработки списка IP-адресов в виде списка строк, когда один элемент IP
  • 1текстовое представление конфликтующих Android
  • 1Эффективная замена всех неподдерживаемых символов в строке [дубликаты]
  • 0SyntaxError при попытке получить стиль
  • 0JSON в CSV преобразование в PHP
  • 1Использование Matlab из обновления переменной c #
  • 0Почему элемент <br> имеет больше высоты, чем line-height
  • 0e.preventdefault и asp.net форма входа не работает
  • 1Правильно ли я создаю свой собственный ArrayAdapter?
  • 1Запись в три базы данных с одной отправки с колбой
  • 1Вернуть счетчик значений в панде df
  • 0SQL показывает статические значения для столбца, который никогда не изменяется, но обновляет другие столбцы по мере необходимости
  • 0Группа партнеров из одной колонны
  • 1Соединение между исключениями Java 7
  • 1Лучший способ определить, была ли вызвана функция с правильным количеством аргументов в JavaScript
  • 1Выполнить ручной откат в среде JTA в EJB без сохранения состояния
  • 0OpenGL ничего не рисуя
  • 1Google Plus Android API: «Метод setActions (String []) не определен для типа PlusClient.Builder»
  • 0Использование .has () с событием keyup
  • 1получить размер InputStream в Java

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как размножить строки в excel по количеству в ячейке
  • Как разные числа посчитать на одно в excel
  • Как размножить страницу в word
  • Как разность ячейки в excel
  • Как размножить страницу в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии