Beispiel #1
0
        public void DomReaderBasicTest()
        {
            bool      moved             = false;
            string    paragraphOuterXml = "<w:p w:rsidP=\"001\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"><w:r><w:t>Run Text.</w:t><w:t>Run 2.</w:t></w:r></w:p>";
            Paragraph para = new Paragraph(paragraphOuterXml);

            OpenXmlReader targetReader = OpenXmlReader.Create(para);

            targetReader.Read();

            TestReaderOnParagraph(targetReader);

            moved = targetReader.Read(); // should be false

            Assert.False(moved);
            Assert.True(targetReader.EOF);
            // Assert.NotNull(targetReader.Attributes);
            // Assert.Equal(0, targetReader.Attributes.Count);
            // Assert.False(targetReader.HasAttributes);
            // Assert.False(targetReader.IsStartElement);
            // Assert.False(targetReader.IsEndElement);
            // Assert.False(targetReader.IsMiscNode);
            // Assert.Equal(typeof(Paragraph), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));

            targetReader.Close();

            targetReader = OpenXmlReader.Create(para);
            targetReader.Read();

            moved = targetReader.ReadFirstChild(); // read to <w:r>

            OpenXmlElement element = targetReader.LoadCurrentElement();

            // at the end of the run
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Equal(0, targetReader.Attributes.Count);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Run), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));

            // loaded element is Run
            Assert.NotNull(element);
            Assert.IsType(typeof(Run), element);

            Run run = (Run)element;

            Assert.Equal("Run Text.", (run.FirstChild as Text).Text);
            Assert.Equal("Run 2.", (run.LastChild as Text).Text);

            targetReader.Close();
        }
Beispiel #2
0
            private static void ParseViaSAX(string physicalPath)
            {
                using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(physicalPath, false))
                {
                    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

                    var sheetCount = workbookPart.Workbook.Sheets.Count();



                    foreach (WorksheetPart wsp in workbookPart.WorksheetParts)
                    {
                        var columnCount = wsp.Worksheet.Descendants <Column>().Count();
                        var rowCount    = wsp.Worksheet.Descendants <Row>().Count();
                        var cellCount   = wsp.Worksheet.Descendants <Cell>().Count();

                        OpenXmlReader reader = OpenXmlReader.Create(wsp);
                        string        text;
                        while (reader.Read())
                        {
                            text = reader.GetText();
                            System.Diagnostics.Debug.WriteLine(text + "");
                            //if (reader.ElementType == typeof(CellValue))
                            //{
                            //    text = reader.GetText();
                            //    Console.Write(text + " ");

                            //    System.Diagnostics.Debug.WriteLine(text + "");
                            //}
                        }
                    }
                }
            }
Beispiel #3
0
        public static void WriteStartElement(XmlWriter writer, OpenXmlReader reader)
        {
            if (string.IsNullOrEmpty(reader.Prefix) || reader.Prefix.Equals("x", StringComparison.Ordinal))
            {
                var prolog = writer.WriteState == WriteState.Prolog;
                writer.WriteStartElement(reader.LocalName, reader.NamespaceUri);
                if (prolog)
                {
                    writer.WriteAttributeString("xmlns", null, @"http://www.w3.org/2000/xmlns/", reader.NamespaceUri);
                }
            }
            else
            {
                writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceUri);
            }

            WriteNamespace(writer, reader.NamespaceDeclarations);
            WriteAttributes(writer, reader.Attributes);

            var text = reader.GetText();

            if (!string.IsNullOrEmpty(text))
            {
                writer.WriteString(text);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Test OpenXmlReader GetText() method, and verify the result with XmlReader
        /// </summary>
        /// <param name="reader">the OpenXmlReader that will be tested</param>
        /// <param name="XTreader">the corresponding XmlReader used to verify the result</param>
        private void TestGetText(OpenXmlReader reader, XmlReader Xreader)
        {
            Log.Comment("Test GetText()");

            if (!reader.EOF &&
                reader.ElementType != typeof(OpenXmlMiscNode) &&
                reader.ElementType != typeof(OpenXmlUnknownElement) &&
                Activator.CreateInstance(reader.ElementType) is OpenXmlLeafTextElement)
            {
                var Text = reader.GetText();
                Log.VerifyTrue(Xreader.ReadContentAsString() == Text, "expected: '{0}' <> actual: '{1}'", Xreader.Value, Text);

                Read(reader);
            }
            else
            {
                var Text = reader.GetText();
                Assert.Equal(string.Empty, Text);
            }
        }
Beispiel #5
0
        static void ReadExcelFileSAX(string fileName)
        {
            using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(fileName, false))
            {
                WorkbookPart  workbookPart = spreadsheet.WorkbookPart;
                WorksheetPart worksheet    = workbookPart.WorksheetParts.First();

                OpenXmlReader reader = OpenXmlReader.Create(worksheet);

                string text;
                while (reader.Read())
                {
                    if (reader.ElementType == typeof(CellValue))
                    {
                        text = reader.GetText();
                        Console.WriteLine(text);
                    }
                }
            }
        }
        private static List <string> GetSharedStrings(string xlsxFile)
        {
            List <string> dicionario = new List <string>();

            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(xlsxFile, false))
            {
                WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

                //Get the string List, which is stored in a separate file
                var           sharedStringPart = workbookPart.SharedStringTablePart;
                OpenXmlReader reader           = OpenXmlReader.Create(sharedStringPart);
                while (reader.Read())
                {
                    if (reader.IsStartElement && reader.ElementType == typeof(Text))
                    {
                        dicionario.Add(reader.GetText());
                    }
                }
            }
            return(dicionario);
        }
Beispiel #7
0
        /// <summary>
        /// This method reads a excel file
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        string ReadXlsx(string path)
        {
            StringBuilder builder = new StringBuilder();
            string        text    = builder.ToString();

            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false))
            {
                WorkbookPart  workbookPart  = spreadsheetDocument.WorkbookPart;
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

                OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                while (reader.Read())
                {
                    if (reader.ElementType == typeof(CellValue))
                    {
                        builder.Append(reader.GetText());
                        Console.Write(builder + " ");
                    }
                }
                Console.WriteLine();
                Console.ReadKey();
            }
            return(text);
        }
        // The SAX approach.
        public static List <string> ReadExcelFileSAX(string fileName)
        {
            List <string> values = new List <string>();

            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
            {
                WorkbookPart  workbookPart  = spreadsheetDocument.WorkbookPart;
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

                OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                string        text;

                while (reader.Read())
                {
                    if (reader.ElementType == typeof(CellValue))
                    {
                        text = reader.GetText();
                        values.Add(text + StringResources.wSpaceChar);
                    }
                }

                return(values);
            }
        }
        public void PartReaderBasicTest()
        {
            string partText = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
                              "<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">" +
                              "<w:body>" +
                              "<w:p w:rsidP=\"001\"><w:r><w:t>Run Text.</w:t><w:t>Run 2.</w:t></w:r></w:p>" +
                              "<w:p w:rsidP=\"001\"><w:r><w:t>Run Text.</w:t><w:t>Run 2.</w:t></w:r></w:p>" +
                              "</w:body>" +
                              "</w:document>";

            UTF8Encoding utf8Encoding = new UTF8Encoding();
            Stream       stream       = new MemoryStream(utf8Encoding.GetBytes(partText), false);

            OpenXmlReader targetReader = OpenXmlReader.Create(stream);

            targetReader.Read();

            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.True(targetReader.IsStartElement);
            Assert.False(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal(typeof(Document), targetReader.ElementType);

            targetReader.ReadFirstChild(); // to <w:body>
            targetReader.Read();           // to <w:p>

            TestReaderOnParagraph(targetReader);

            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Paragraph), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.True(targetReader.GetLineInfo().HasLineInfo());
            Assert.Equal(1, targetReader.GetLineInfo().LineNumber);
            Assert.Equal(216, targetReader.GetLineInfo().LinePosition);

            targetReader.ReadNextSibling(); // next <w:p>

            OpenXmlElement element = targetReader.LoadCurrentElement();

            // at </w:p>
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Paragraph), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal(1, targetReader.GetLineInfo().LineNumber);
            Assert.Equal(295, targetReader.GetLineInfo().LinePosition);

            // loaded element is Run
            Assert.NotNull(element);
            Assert.IsType <Paragraph>(element);

            Run run = (Run)element.FirstChild;

            Assert.Equal("Run Text.", (run.FirstChild as Text).Text);
            Assert.Equal("Run 2.", (run.LastChild as Text).Text);

            targetReader.Close();
        }
        ///<summary>
        ///TestReaderOnPragraph.
        ///</summary>
        private void TestReaderOnParagraph(OpenXmlReader targetReader)
        {
            bool moved = false;

            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Single(targetReader.Attributes);
            Assert.True(targetReader.HasAttributes);
            Assert.True(targetReader.IsStartElement);
            Assert.False(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal(typeof(Paragraph), targetReader.ElementType);

            moved = targetReader.Read(); // read to <w:r>

            Assert.True(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.True(targetReader.IsStartElement);
            Assert.False(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal(typeof(Run), targetReader.ElementType);

            moved = targetReader.ReadFirstChild(); // read to <w:t>

            Assert.True(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.True(targetReader.IsStartElement);
            Assert.False(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Text), targetReader.ElementType);
            Assert.False(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal("Run Text.", targetReader.GetText());

            moved = targetReader.Read(); // read to </w:t>

            Assert.True(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Text), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));

            moved = targetReader.ReadNextSibling(); // read to <w:t>

            Assert.True(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.True(targetReader.IsStartElement);
            Assert.False(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Text), targetReader.ElementType);
            Assert.False(string.IsNullOrEmpty(targetReader.GetText()));
            Assert.Equal("Run 2.", targetReader.GetText());

            moved = targetReader.ReadNextSibling(); // read to </w:r>, skip the </w:t>

            Assert.False(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Run), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));

            moved = targetReader.Read(); // read to </w:p>

            Assert.True(moved);
            Assert.False(targetReader.EOF);
            Assert.NotNull(targetReader.Attributes);
            Assert.Empty(targetReader.Attributes);
            Assert.False(targetReader.HasAttributes);
            Assert.False(targetReader.IsStartElement);
            Assert.True(targetReader.IsEndElement);
            Assert.False(targetReader.IsMiscNode);
            Assert.Equal(typeof(Paragraph), targetReader.ElementType);
            Assert.True(string.IsNullOrEmpty(targetReader.GetText()));
        }
        public int write(List <List <IWritable> > dataList)
        {
            int retvalueTemp = 0;

            if (_doc != null && _workBook != null && _workSheet != null)
            {
                string originalPartId = _workBook.GetIdOfPart(_workSheet);

                WorksheetPart replacementPart   = _workBook.AddNewPart <WorksheetPart>();
                string        replacementPartId = _workBook.GetIdOfPart(replacementPart);

                _reader = OpenXmlReader.Create(_workSheet);
                _writer = OpenXmlWriter.Create(replacementPart);

                while (_reader.Read())
                {
                    if (_reader.ElementType == typeof(Selection))
                    {
                        continue;
                    }
                    if (_reader.ElementType == typeof(SheetData))
                    {
                        if (_reader.IsStartElement)
                        {
                            _writer.WriteStartElement(_reader);
                            continue;
                        }

                        // append section begins
                        //_writer.WriteStartElement(new SheetData()); // beginning of sheetdata
                        for (int rowIndex = 0; rowIndex < dataList.Count; rowIndex++)
                        {
                            Row row = new Row();
                            _writer.WriteStartElement(row); // begining of row
                            for (int colIndex = 0; colIndex < dataList.Count; colIndex++)
                            {
                                Cell cell = new Cell();
                                cell.CellValue = new CellValue(dataList[rowIndex][colIndex].ToString());
                                _writer.WriteElement(cell);
                            }
                            _writer.WriteEndElement(); // end of row
                        }
                        _writer.WriteEndElement();     // end of sheetdata
                    }
                    else
                    {
                        if (_reader.IsStartElement)
                        {
                            _writer.WriteStartElement(_reader);
                            if (_reader.ElementType == typeof(CellValue))
                            {
                                _writer.WriteString(_reader.GetText());
                            }
                        }
                        else if (_reader.IsEndElement)
                        {
                            _writer.WriteEndElement();
                        }
                        else
                        {
                        }
                    }
                }

                _writer.Close();
                _reader.Close();

                Sheet sheet = _workBook.Workbook.Descendants <Sheet>().Where(s => s.Id.Value.Equals(originalPartId)).First();
                sheet.Id.Value = replacementPartId;
                _workBook.DeletePart(_workSheet);
            }
            else
            {
                retvalueTemp = -1;
            }
            return(retvalueTemp);
        }
        public int writeHeader(List <ChannelModel> channels, OperatorModel operatorParam, FacilityModel facilityParam)
        {
            int retvalueTemp = 0;

            if (_doc != null && _workBook != null && _workSheet != null)
            {
                string originalPartId = _workBook.GetIdOfPart(_workSheet);

                WorksheetPart replacementPart   = _workBook.AddNewPart <WorksheetPart>();
                string        replacementPartId = _workBook.GetIdOfPart(replacementPart);

                _reader = OpenXmlReader.Create(_workSheet);
                _writer = OpenXmlWriter.Create(replacementPart);

                while (_reader.Read())
                {
                    if (_reader.ElementType == typeof(Selection))
                    {
                        continue;
                    }
                    if (_reader.ElementType == typeof(SheetData))
                    {
                        if (_reader.IsEndElement)
                        {
                            continue;
                        }

                        _writer.WriteStartElement(new SheetData()); // beginning of sheetdata
                        // append section begins
                        var labelRow = new Row();                   // label row
                        labelRow.RowIndex = 1;

                        _writer.WriteStartElement(labelRow);  // begining of row
                        var operatorLabelCell     = new Cell();
                        var facilityLabelCell     = new Cell();
                        var creationDateLabelCell = new Cell();

                        operatorLabelCell.CellValue     = new CellValue(" Operatör ");
                        facilityLabelCell.CellValue     = new CellValue(" Tesis ");
                        creationDateLabelCell.CellValue = new CellValue(" Oluşturulma Tarihi ");

                        _writer.WriteElement(operatorLabelCell);
                        _writer.WriteElement(facilityLabelCell);
                        _writer.WriteElement(creationDateLabelCell);

                        _writer.WriteEndElement();          // end of label row

                        var infoRow = new Row();            // info row
                        infoRow.RowIndex = 2;
                        _writer.WriteStartElement(infoRow); // begining of row

                        var operatorInfoCell     = new Cell();
                        var facilityInfoCell     = new Cell();
                        var creationDateInfoCell = new Cell();

                        operatorInfoCell.CellValue     = new CellValue(operatorParam.DisplayName);
                        facilityInfoCell.CellValue     = new CellValue(facilityParam.ListDisplay);
                        creationDateInfoCell.CellValue = new CellValue(DateTime.Now.ToShortTimeString());

                        _writer.WriteElement(operatorInfoCell);
                        _writer.WriteElement(facilityInfoCell);
                        _writer.WriteElement(creationDateInfoCell);

                        _writer.WriteEndElement();                 // end of info row

                        var channelListRow = new Row();            // channelListRow row
                        channelListRow.RowIndex = 3;
                        _writer.WriteStartElement(channelListRow); // begining of row
                        for (int k = 0; k < channels.Count; k++)
                        {
                            var dataInfoCell = new Cell();
                            dataInfoCell.CellValue = new CellValue(channels[k].name);
                            _writer.WriteElement(dataInfoCell);
                        }
                        _writer.WriteEndElement(); // end of channel info  row

                        _writer.WriteEndElement(); // end of sheetdata
                    }
                    else
                    {
                        if (_reader.IsStartElement)
                        {
                            _writer.WriteStartElement(_reader);
                            if (_reader.ElementType == typeof(CellValue))
                            {
                                _writer.WriteString(_reader.GetText());
                            }
                        }
                        else if (_reader.IsEndElement)
                        {
                            _writer.WriteEndElement();
                        }
                        else
                        {
                        }
                    }
                }

                _writer.Close();
                _reader.Close();

                Sheet sheet = _workBook.Workbook.Descendants <Sheet>().Where(s => s.Id.Value.Equals(originalPartId)).First();
                sheet.Id.Value = replacementPartId;
                _workBook.DeletePart(_workSheet);
            }
            else
            {
                retvalueTemp = -1;
            }
            return(retvalueTemp);
        }
        /// <summary>
        /// Creates a CSV from the sheet number sheetId of the xlsxFile, using the separator
        /// </summary>
        /// <param name="xlsxFile">xlsx file to read from</param>
        /// <param name="sheetId">Index of the sheet, base 1</param>
        /// <param name="csvFile">Destination csv file</param>
        /// <param name="separator">csv separator. Default ','</param>
        public static void CreateCsv(string xlsxFile, int sheetId, string csvFile, char separator = ',')
        {
            int LastRow     = -1;
            int LastColumn  = -1;
            int FirstRow    = -1;
            int FirstColumn = -1;

            List <string> dicionario    = GetSharedStrings(xlsxFile);
            var           relationships = GetWorksheetsIds(xlsxFile);

            var id = relationships.FirstOrDefault(x => x.SheetId == sheetId);

            if (id == null)
            {
                throw new ArgumentException($"The sheet {sheetId} doesn't exists");
            }
            using (StreamWriter sw = new StreamWriter(csvFile, false))
            {
                using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(xlsxFile, false))
                {
                    WorkbookPart  workbookPart  = spreadsheetDocument.WorkbookPart;
                    WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(
                        relationships.First(x => x.SheetId == sheetId).RelationshipId
                        );
                    OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                    //Get sheet dimensions
                    while (reader.Read())
                    {
                        if (reader.IsStartElement && reader.ElementType == typeof(SheetDimension))
                        {
                            int[] dim = TranslateAddress(reader.Attributes[0].Value);
                            FirstRow    = dim[0];
                            FirstColumn = dim[1];
                            //Range as the sheet dimension
                            if (dim.Length == 4)
                            {
                                LastRow    = dim[2];
                                LastColumn = dim[3];
                            }
                            //Cell as the sheet dimension (only 1 cell has been initialized)
                            else
                            {
                                LastRow    = dim[0];
                                LastColumn = dim[1];
                            }
                            break;
                        }
                    }

                    int      ll         = 0;
                    string[] currentRow = new string[LastColumn];
                    while (reader.Read())
                    {
                        if (reader.IsStartElement)
                        {
                            if (reader.ElementType == typeof(Row))
                            {
                                //Initialize a new row
                                currentRow = new string[LastColumn];

                                //Add rows that aren't in the file (unitialized rows aren't saved in xlsx)
                                var line = int.Parse(reader.Attributes.First(x => x.LocalName == "r").Value);
                                while (++ll < line)
                                {
                                    var lin = string.Join(separator.ToString(), currentRow);
                                    sw.WriteLine(lin);
                                }
                            }
                            else if (reader.ElementType == typeof(Cell))
                            {
                                //Pick the data type of the Cell. s for sharedString, str for string,
                                //b for bool and absent for numbers
                                var tipo     = reader.Attributes.FirstOrDefault(x => x.LocalName == "t").Value;
                                var endereco = TranslateAddress(
                                    reader.Attributes.First(x => x.LocalName == "r").Value
                                    );
                                //Search for the CellValue or quit if it find the closing Cell tag
                                while (reader.ElementType != typeof(CellValue) ||
                                       (reader.ElementType != typeof(Cell) && reader.IsEndElement))
                                {
                                    reader.Read();
                                }
                                if (reader.ElementType == typeof(CellValue))
                                {
                                    switch (tipo)
                                    {
                                    //Shared string
                                    case "s":
                                        currentRow[endereco[1] - 1] =
                                            dicionario[int.Parse(reader.GetText())];
                                        break;

                                    //Number
                                    case null:
                                    //String
                                    case "str":
                                        currentRow[endereco[1] - 1] = reader.GetText();
                                        break;

                                    //Boolean
                                    case "b":
                                        currentRow[endereco[1] - 1] =
                                            reader.GetText() == "1" ? "true" : "false";
                                        break;
                                    }
                                }
                            }
                        }
                        else
                        {
                            //Add the created row when found the closing Row tag
                            if (reader.ElementType == typeof(Row))
                            {
                                sw.WriteLine(string.Join(separator.ToString(), currentRow));
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Creates a DataTable from the sheet sheetName of the file xlsxFile
        /// </summary>
        /// <param name="xlsxFile">xlsx file to read</param>
        /// <param name="sheetId">Index of the sheet, base 1</param>
        /// <returns>DataTable with column names as Excel string column address</returns>
        public static DataTable CreateDataTable(string xlsxFile, int sheetId)
        {
            DataTable dt          = new DataTable();
            int       LastRow     = -1;
            int       LastColumn  = -1;
            int       FirstRow    = -1;
            int       FirstColumn = -1;

            List <string> dicionario    = GetSharedStrings(xlsxFile);
            var           relationships = GetWorksheetsIds(xlsxFile);

            var id = relationships.FirstOrDefault(x => x.SheetId == sheetId);

            if (id == null)
            {
                throw new ArgumentException($"The sheet {sheetId} doesn't exists");
            }

            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(xlsxFile, false))
            {
                WorkbookPart  workbookPart  = spreadsheetDocument.WorkbookPart;
                WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(
                    relationships.First(x => x.SheetId == sheetId).RelationshipId
                    );
                OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                //Get sheet dimensions
                while (reader.Read())
                {
                    if (reader.IsStartElement && reader.ElementType == typeof(SheetDimension))
                    {
                        int[] dim = TranslateAddress(reader.Attributes[0].Value);
                        FirstRow    = dim[0];
                        FirstColumn = dim[1];
                        //Range as the sheet dimension
                        if (dim.Length == 4)
                        {
                            LastRow    = dim[2];
                            LastColumn = dim[3];
                        }
                        //Cell as the sheet dimension (only 1 cell has been initialized)
                        else
                        {
                            LastRow    = dim[0];
                            LastColumn = dim[1];
                        }
                        break;
                    }
                }
                //Define the columns. The column name is in Excel format (A,B,C...)
                for (int c = 1; c <= LastColumn; c++)
                {
                    dt.Columns.Add(ColumnName(c));
                }

                int      ll         = 0;
                object[] currentRow = new object[LastColumn];
                while (reader.Read())
                {
                    if (reader.IsStartElement)
                    {
                        if (reader.ElementType == typeof(Row))
                        {
                            //Add rows that aren't in the file (unitialized rows aren't saved in xlsx)
                            var line = int.Parse(reader.Attributes.First(x => x.LocalName == "r").Value);
                            while (++ll < line)
                            {
                                dt.Rows.Add(dt.NewRow());
                            }
                            //Initialize a new row
                            currentRow = new object[LastColumn];
                        }
                        else if (reader.ElementType == typeof(Cell))
                        {
                            //Pick the data type of the Cell. s for sharedString, str for string,
                            //b for bool and absent for numbers
                            var tipo     = reader.Attributes.FirstOrDefault(x => x.LocalName == "t").Value;
                            var endereco = TranslateAddress(
                                reader.Attributes.First(x => x.LocalName == "r").Value
                                );
                            //Search for the CellValue or quit if it find the closing Cell tag
                            while (reader.ElementType != typeof(CellValue) ||
                                   (reader.ElementType != typeof(Cell) && reader.IsEndElement))
                            {
                                reader.Read();
                            }
                            if (reader.ElementType == typeof(CellValue))
                            {
                                switch (tipo)
                                {
                                //Shared string
                                case "s":
                                    currentRow[endereco[1] - 1] =
                                        dicionario[int.Parse(reader.GetText())];
                                    break;

                                //Number
                                case null:
                                    if (int.TryParse(reader.GetText(), out int saida))
                                    {
                                        currentRow[endereco[1] - 1] = saida;
                                    }
                                    else
                                    {
                                        currentRow[endereco[1] - 1] =
                                            Convert.ToDouble(reader.GetText(),
                                                             CultureInfo.InvariantCulture);
                                    }
                                    break;

                                //String
                                case "str":
                                    currentRow[endereco[1] - 1] = reader.GetText();
                                    break;

                                //Boolean
                                case "b":
                                    currentRow[endereco[1] - 1] =
                                        reader.GetText() == "1" ? true : false;
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        //Add the created row when found the closing Row tag
                        if (reader.ElementType == typeof(Row))
                        {
                            dt.Rows.Add(currentRow);
                        }
                    }
                }
            }
            return(dt);
        }
Beispiel #15
0
        public void ReplaceTemplateValuesByToken(Dictionary <string, string> tokens, WorksheetPart workSheetPart)
        {
            List <string> sharedStrings = GetSharedStringList();

            StartWritingWithTemplate(workSheetPart);

            while (_reader.Read())
            {
                if (_reader.ElementType == typeof(SheetData))
                {
                    if (_reader.IsEndElement)
                    {
                        continue;
                    }

                    //Reading template sheet data
                    _writer.WriteStartElement(new SheetData());
                    _reader.Read();

                    while (true)
                    {
                        if (_reader.ElementType == typeof(SheetData) && _reader.IsEndElement)
                        {
                            break;
                        }

                        if (_reader.IsStartElement)
                        {
                            _writer.WriteStartElement(_reader);


                            if (_reader.ElementType.IsSubclassOf(typeof(OpenXmlLeafTextElement)))
                            {
                                string text;

                                try
                                {
                                    int index = Convert.ToInt32(_reader.GetText());
                                    text = sharedStrings[index];
                                }
                                catch
                                {
                                    text = _reader.GetText();
                                }


                                tokens.Keys.Where(x => text.IndexOf(x) != -1).ToList().ForEach(x => text = text.Replace(x, tokens[x]));

                                _writer.WriteString(text);
                            }
                        }
                        else if (_reader.IsEndElement)
                        {
                            _writer.WriteEndElement();
                        }
                        _reader.Read();
                    }

                    _writer.WriteEndElement();//close sheet
                    //_workbookPart.Workbook.Save();
                    //break;
                }
                else
                {
                    if (_reader.IsStartElement)
                    {
                        _writer.WriteStartElement(_reader);
                    }
                    else if (_reader.IsEndElement)
                    {
                        _writer.WriteEndElement();
                    }
                }
            }

            EndWritingWithTemplate();
        }
Beispiel #16
0
        /// <summary>
        /// Converting a XLSX File to a CSV File
        /// </summary>
        /// <param name="excelFilePath">Full xlsx file path</param>
        public static bool Converter_XlsxToCsv(string excelFilePath)
        {
            var fileToWrite = System.IO.Path.Combine(Path.GetDirectoryName(excelFilePath), System.IO.Path.GetFileNameWithoutExtension(excelFilePath) + ".csv");
            var outputFile  = new StreamWriter(fileToWrite, false, Encoding.UTF8);

            try
            {
                using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(excelFilePath, true))
                {
                    WorkbookPart  workbookPart  = myDoc.WorkbookPart;
                    WorksheetPart worksheetPart = workbookPart.GetPartById("rId1") as WorksheetPart;

                    int dateIndex  = -1;
                    int styleIndex = 0;

                    List <int> countDateForm = new List <int>();

                    foreach (CellFormat format in workbookPart.WorkbookStylesPart.Stylesheet.CellFormats)
                    {
                        //if (format.NumberFormatId == 14 )
                        //{
                        //    dateIndex = styleIndex;
                        //    break;
                        //}
                        if (format.NumberFormatId == 14)
                        {
                            countDateForm.Add(styleIndex);
                        }

                        ++styleIndex;
                    }

                    var sharedDico = new Dictionary <string, string>();


                    int i = 0;

                    workbookPart.SharedStringTablePart.SharedStringTable.ChildElements.ToList().ForEach(e => sharedDico.Add(i++.ToString(), e.InnerText.Replace(";", ":").Replace("\n", "").Replace("'", " ")));

                    StringBuilder lineBuilder    = null;
                    bool          isSharedString = false;
                    char          previousColumn = default(char);
                    bool          mustAddValue   = false;
                    string[]      Col;
                    int           nb_column    = 0;
                    int           column       = 0;
                    bool          firstDetec   = false;
                    bool          isDate       = false;
                    bool          isCellFormul = false;

                    OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                    while (reader.Read())
                    {
                        if (reader.LocalName == "row")
                        {
                            if (reader.IsStartElement)
                            {
                                lineBuilder  = new StringBuilder();
                                mustAddValue = false;
                            }
                            else
                            {
                                Col    = lineBuilder.ToString().Split(';');
                                column = Col.Count();

                                if (firstDetec == false)
                                {
                                    nb_column  = column;
                                    firstDetec = true;
                                }

                                if (nb_column == column && firstDetec == true)
                                {
                                    outputFile.WriteLine(lineBuilder.ToString());
                                }

                                else if (nb_column > column && firstDetec == true)
                                {
                                    int    nbColMissing = nb_column - column;
                                    string sep          = null;

                                    for (int ajoutCol = 0; ajoutCol < nbColMissing; ajoutCol++)
                                    {
                                        sep += ';';
                                    }

                                    outputFile.WriteLine(lineBuilder.ToString() + sep);
                                }
                                else if (nb_column < column && firstDetec == true)
                                {
                                    int nbColMissing  = column - nb_column;
                                    int countLastChar = 0;

                                    for (int ajoutCol = lineBuilder.Length - 1; ajoutCol >= 0; ajoutCol--)
                                    {
                                        if (lineBuilder[ajoutCol] != ';')
                                        {
                                            break;
                                        }
                                        countLastChar++;
                                    }

                                    if (countLastChar == nbColMissing)
                                    {
                                        outputFile.WriteLine(lineBuilder.ToString().Substring(0, lineBuilder.Length - nbColMissing));
                                    }
                                    else
                                    {
                                        outputFile.WriteLine(lineBuilder.ToString());
                                    }
                                }
                                else
                                {
                                    outputFile.WriteLine(lineBuilder.ToString());
                                }
                            }
                            continue;
                        }

                        if (reader.IsEndElement)
                        {
                            continue;
                        }

                        if (reader.LocalName == "c")
                        {
                            if (mustAddValue)
                            {
                                lineBuilder.Append(";");
                            }

                            isSharedString = reader.Attributes.Any(a => a.LocalName == "t");
                            //isDate = reader.Attributes.Any(a => a.LocalName == "s" && a.Value == dateIndex.ToString());
                            isDate = reader.Attributes.Any(a => a.LocalName == "s" && countDateForm.Contains(Convert.ToInt32(a.Value)));

                            OpenXmlAttribute codeCellule = reader.Attributes.FirstOrDefault(a => a.LocalName == "r");
                            if (codeCellule != null)
                            {
                                char cellColumn       = Regex.Replace(codeCellule.Value, "[0-9]", "").Last();
                                int  indexCol         = ALPHABET.IndexOf(cellColumn);
                                int  indexPreviousCol = ALPHABET.IndexOf(previousColumn);
                                int  diff             = indexCol - indexPreviousCol;
                                if (diff > 1)
                                {
                                    for (int j = 1; j < diff; j++)
                                    {
                                        lineBuilder.Append(";");
                                    }
                                }
                                previousColumn = cellColumn;
                            }
                            mustAddValue = true;
                            continue;
                        }
                        if (reader.LocalName == "f")
                        {
                            isCellFormul = true;
                        }
                        if (reader.LocalName == "v")
                        {
                            string value = reader.GetText();

                            if (value.StartsWith("#"))
                            {
                                lineBuilder.Append(string.Empty);
                            }
                            else if (isSharedString && !isCellFormul)
                            {
                                lineBuilder.Append(sharedDico[value]);
                            }
                            else if (isSharedString && !isDate)
                            {
                                lineBuilder.Append(value);
                            }
                            else if (isDate && !value.Contains('-') && !value.Contains('+') && !value.Contains('.') && !value.Contains(','))
                            {
                                lineBuilder.Append(DateTime.FromOADate(double.Parse(value)).ToShortDateString());
                            }
                            else if (value.Contains("E-") || value.Contains("E+"))
                            {
                                lineBuilder.Append(decimal.Parse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture));
                            }
                            else
                            {
                                if (value.Contains('.') || value.Contains(','))
                                {
                                    lineBuilder.Append(double.Parse(value, NumberStyles.Any, CultureInfo.InvariantCulture));
                                }
                                else
                                {
                                    lineBuilder.Append(value);
                                }
                            }
                            lineBuilder.Append(";");
                            isCellFormul = false;
                            mustAddValue = false;
                            continue;
                        }
                    }
                }
                outputFile.Close();
                return(true);
            }
            catch (OleDbException)
            {
                return(false);
            }
        }
Beispiel #17
0
        private void HandleCellValueStartElement(OpenXmlReader reader)
        {
            string text = "";

            hasCellValue = true;

            if (isSharedString)
            {
                text = sharedStringItems[Convert.ToInt32(reader.GetText())].InnerText;
            }
            else
            {
                text = reader.GetText();
            }

            text = text.Replace("\n", " ");
            text = text.Replace("\"", "'");

            if (numberFormatToApply > -1)
            {
                DateTime testDateTime;

                // TODO Add new number format handlers when faced
                switch (numberFormatToApply)
                {
                case 14:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);
                    break;

                case 15:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("d-MMM-yy");
                    break;

                case 16:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("d-MMM");
                    break;

                case 17:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("MMM-yy");
                    break;

                case 18:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("h:mm tt");
                    break;

                case 19:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("h:mm:ss tt");
                    break;

                case 20:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("h:mm");
                    break;

                case 21:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString("h:mm:ss");
                    break;

                case 22:
                    testDateTime = DateTime.FromOADate(Convert.ToDouble(text));
                    text         = testDateTime.ToString(string.Format("{0} h:mm", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern));
                    break;

                default:
                    break;
                }
            }

            // For header row, sometimes it is a requirement to have unique names
            // If it is not, this part and the headers dictionary can be removed
            if (rowCount == 0)
            {
                // if header text is empty, do not write this column
                if (text == "")
                {
                    columnsToSkip.Add(currColumnIndex);
                }

                if (!headers.ContainsKey(text))
                {
                    headers.Add(text, 1);
                }
                else
                {
                    headers[text] = headers[text] + 1;
                    text          = text + headers[text];
                }
            }

            if (!columnsToSkip.Contains(currColumnIndex))
            {
                lineBuilder.Append(string.Format("{0}{1}{0}", textDelimiter, text));

                // check end of row
                if (currColumnIndex != sheetEndColumnIndex)
                {
                    lineBuilder.Append(columnDelimiter);
                }
            }
        }