1

Тема: Як пропарсити XLSX?

Йоу. Мені тре взяти файл екселівський, і вийняти з нього деяку інфу. Я зараз юзаю такий от код

using System;
using System.Linq;
using System.Windows.Forms;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace XLSXtoJSON
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           if( openFileDialog1.ShowDialog()==DialogResult.OK)
            {
                ReadExcelFileDOM(openFileDialog1.FileName);
            }
        }

        static void ReadExcelFileDOM(string fileName)
        {
            string result = "";
            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
            {
                WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
                foreach(var ws in workbookPart.WorksheetParts)
                {
                    result += ws.Worksheet.LocalName + " ";
                }
                MessageBox.Show(result);
                result = "";
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
                string text;
                foreach (Row r in sheetData.Elements<Row>())
                {
                    foreach (Cell c in r.Elements<Cell>())
                    {
                        try {
                            text = c.CellValue.Text;
                            result += (text + " ");
                        }
                        catch(Exception e) { }
                    }
                }
                result += "\n";
                MessageBox.Show(result);
            }
        }
    }
}

Тут я хочу вивести назви усіх чотирьох сторінок, що присутні в файлі, а також інфу з отих дірочок, що на кожній сторінці. Але воно виводить лише от що
http://не-дійсний-домен/kGsMi/e3012d5d3b.png а тут мали б бути коректні назви сторінок.

І от ще що
http://не-дійсний-домен/kGsNL/cc113b48e4.png а тут мала б бути інфа з дірочок
Шо не так? Як пофіксити?

2

Re: Як пропарсити XLSX?

Хлопці. Як воно працює? Надибав трохи інший код. Дивіться, на нього

void ReadExcelFileDOM(string fileName)
{
    var filePath = fileName;
    string result = "";
    using (var document = SpreadsheetDocument.Open(filePath, false))
    {
        var workbookPart = document.WorkbookPart;
        var workbook = workbookPart.Workbook;

        var sheets = workbook.Descendants<Sheet>();
        int i = 0;

        var sheet = sheets.Where(s => s.Name == "CORE GAME").ToList()[0];

        var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
        var sharedStringPart = workbookPart.SharedStringTablePart;
        var values = sharedStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();

        MessageBox.Show("values: " + values.Length);

        var cells = worksheetPart.Worksheet.Descendants<Cell>();

        foreach (var cell in cells)
        {
            try {
                // The cells contains a string input that is not a formula
                if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
                {
                    var index = int.Parse(cell.CellValue.Text);
                    var value = values[index].InnerText;
                    richTextBox1.Text += value + " index "+index+"\n";
                    if(value.Contains("CHAPTER"))
                    {
                        richTextBox1.Text += "CHAPTER " + (i + 1);
                    }
                }
                else
                {
                    //result += cell.CellValue.Text + "\n";
                }
            }
            catch(Exception e) { }
        }
    }
}

Тепер гляньте, шо воно пише, і як виглядає сама сторінка.

http://не-дійсний-домен/kGGzP/e08c5a9895.png
http://не-дійсний-домен/kGGGd/30887004f4.png

Я хочу побудувати JSON або XML файл такої структури

Chapters
   Chapter 1
        Page 1
             Key = Value
             Key = Value
             Key = Value
             Key = Value
        Page 2
             Key = Value
             Key = Value
             Key = Value
             Key = Value
         ...
   Chapter 2
        Page 1
             Key = Value
             Key = Value
             Key = Value
             Key = Value

І як мені то зробити, якщо не зрозуміло, як знайти ту чи іншу інфовину в таблиці?

3

Re: Як пропарсити XLSX?

методом розумової активності я досяг такого результату
http://не-дійсний-домен/kHuTP/5654d4cc2e.png

Подякували: 0xDADA11C71

4 Востаннє редагувалося FakiNyan (12.10.2015 14:54:36)

Re: Як пропарсити XLSX?

тобто між рядками CHAPTER знаходиться інфа для усіх сторінок, що лежать в цьому CHAPTER'і.
Тепер буду робити так:

якщо ми зустріли першу строку ЧАПТЕР, то це значить, що далі йде інфа якась. Якщо ми зустріли після цього строку Background Art, то це значить, що нам треба створити новий клас Page, і занести в нього наступну інфу, котра нам зустрінеться. Ну от. Поки зустрічаємо Background Art, то створюємо новий клас, і пихаємо його в список. Далі, якщо зустріли строку, котра містить в собі назву заголовку (ForeAdded Art, VFX (loop)..), то просто запихуємо наступну інфу в клас, що міститься в списку. І ще треба ітератор, аби ми знали, в який клас запихувати. Ну і коли вже зустрічаємо наступний ЧАПТЕР, то запихуємо сформований список з Page кудись там, і починаємо заново всю процедуру

5 Востаннє редагувалося FakiNyan (12.10.2015 18:04:30)

Re: Як пропарсити XLSX?

от так прості пацани вирішують задачі

Прихований текст

http://не-дійсний-домен/kHFcJ/b6a6e3dc76.png