从Excel文件中的Open XML阅读 [英] open xml reading from excel file

查看:172
本文介绍了从Excel文件中的Open XML阅读的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要实现的OpenXML SDK 2.5到我的项目。我做这个链接一切

 使用DocumentFormat.OpenXml;
使用DocumentFormat.OpenXml.Packaging;
使用DocumentFormat.OpenXml.S preadsheet;
使用System.IO.Packaging程序;
静态无效的主要(字串[] args)
        {            字符串文件名= @C:\\ OPENXML \\ BigData.xlsx
            //注释以下行之一,分别测试方法。
            ReadExcelFileDOM(文件名); // DOM
            // ReadExcelFileSAX(文件名); // SAX
        }        //将DOM方法。
        //注意下面的code仅适用于那些包含数字值的单元格。
        //
        静态无效ReadExcelFileDOM(字符串文件名)
        {
            使用(S preadsheetDocument US preadsheetDocument = S preadsheetDocument.Open(文件名,FALSE))
            {
                WorkbookPart workbookPart = S preadsheetDocument.WorkbookPart;
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                SheetData sheetData = worksheetPart.Worksheet.Elements< SheetData>()(第)。
                字符串文本;                INT rowCount等= sheetData.Elements<行方式>()计数();                的foreach(行R在sheetData.Elements<行>())
                {
                    的foreach(单元C在r.Elements<电池>())
                    {
                        文= c.CellValue.Text;
                        Console.Write(文字+);
                    }
                }
                Console.WriteLine();
                Console.ReadKey();
            }
        }

但我没有得到任何一行。它并没有进入循环。注:我还建立了处理OpenXML SDK 2.5我的电脑

和我在下面找到code这是数字value.For字符串值工作写入0 1 2 ...

 私有静态无效的主要(字串[] args)
            {
                VAR文件路径= @C:/OPENXML/BigData.xlsx
                使用(VAR文件= S preadsheetDocument.Open(文件路径,FALSE))
                {
                    VAR workbookPart = document.WorkbookPart;
                    VAR工作簿= workbookPart.Workbook;                    VAR表= workbook.Descendants<板>();
                    的foreach(VAR片表)
                    {
                        VAR worksheetPart =(WorksheetPart)workbookPart.GetPartById(sheet.Id);
                        VAR sharedStringPart = workbookPart.SharedStringTablePart;
                        //变种值= sharedStringPart.SharedStringTable.Elements&所述; SharedStringItem方式>()ToArray的();                        字符串文本;
                        VAR行= worksheetPart.Worksheet.Descendants<行>();
                        的foreach(行VAR行)
                        {
                            Console.WriteLine();
                            诠释计数= row.Elements<电池>()计数()。                            的foreach(单元C在row.Elements<电池>())
                            {                                文= c.CellValue.InnerText;                                Console.Write(文字+);                            }
                        }
                    }
                }                到Console.ReadLine();
            }


解决方案

您的做法似乎为我工作正常 - 因为它没有进入循环。
不过你也可以尝试类似以下内容:

 无效的主要()
{
    字符串文件名= @C:\\路径\\为\\我\\ file.xlsx    使用(的FileStream FS =新的FileStream(文件名,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
    {
        使用(S preadsheetDocument DOC = S preadsheetDocument.Open(FS,FALSE))
        {
            WorkbookPart workbookPart = doc.WorkbookPart;
            SharedStringTablePart sstpart = workbookPart.GetPartsOfType< SharedStringTablePart>()(第)。
            SharedStringTable SST = sstpart.SharedStringTable;            WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
            工作表表= worksheetPart.Worksheet;            VAR细胞= sheet.Descendants<电池>();
            VAR行= sheet.Descendants<行>();            Console.WriteLine(行数= {0},rows.LongCount());
            Console.WriteLine(细胞计数= {0},cells.LongCount());            //方式一:通过在工作表每个单元
            的foreach(细胞细胞细胞)
            {
                如果((cell.DataType = NULL)及!及(cell.DataType == CellValues​​.SharedString))
                {
                    INT SSID = int.Parse(cell.CellValue.Text);
                    字符串str = sst.ChildElements [SSID] .InnerText;
                    Console.WriteLine(共享字符串{0}:{1},SSID,STR);
                }
                否则,如果(cell.CellValue!= NULL)
                {
                    Console.WriteLine(单元格内容:{0},cell.CellValue.Text);
                }
             }             //或者...通过每一行
             的foreach(行鳞次栉比)
             {
                 的foreach(单元C在row.Elements<电池>())
                 {
                     如果((c.DataType = NULL)及!及(c.DataType == CellValues​​.SharedString))
                     {
                         INT SSID = int.Parse(c.CellValue.Text);
                         字符串str = sst.ChildElements [SSID] .InnerText;
                         Console.WriteLine(共享字符串{0}:{1},SSID,STR);
                     }
                     否则,如果(c.CellValue!= NULL)
                     {
                         Console.WriteLine(单元格内容:{0},c.CellValue.Text);
                     }
                 }
             }
         }
     }
 }

我用了FILESTREAM的方法来打开工作簿,因为这可以让你使用的共享访问打开它 - 让您可以在同一时间工作簿在Excel中打开。在S preadsheet.Open(...方法不会在工作簿是在其他地方开放工作。

也许这就是为什么你的code没有工作。

请注意,另外,使用该SharedStringTable的获取细胞文本在适当

I want to implement openXml sdk 2.5 into my project. I do everything in this link

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO.Packaging;


static void Main(string[] args)
        {

            String fileName = @"C:\OPENXML\BigData.xlsx";
            // Comment one of the following lines to test the method separately.
            ReadExcelFileDOM(fileName);    // DOM
            //ReadExcelFileSAX(fileName);    // SAX
        }

        // The DOM approach.
        // Note that the code below works only for cells that contain numeric values.
        // 
        static void ReadExcelFileDOM(string fileName)
        {
            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
            {
                WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
                string text;

                int rowCount= sheetData.Elements<Row>().Count();

                foreach (Row r in sheetData.Elements<Row>())
                {
                    foreach (Cell c in r.Elements<Cell>())
                    {
                        text = c.CellValue.Text;
                        Console.Write(text + " ");
                    }
                }
                Console.WriteLine();
                Console.ReadKey();
            }
        }

But i am not getting any row. It hasn't entered loop. Note: I also set up openXml sdk 2.5 my computer

And I find below code this is work for numeric value.For string value it writes 0 1 2 ...

 private static void Main(string[] args)
            {
                var filePath = @"C:/OPENXML/BigData.xlsx";
                using (var document = SpreadsheetDocument.Open(filePath, false))
                {
                    var workbookPart = document.WorkbookPart;
                    var workbook = workbookPart.Workbook;

                    var sheets = workbook.Descendants<Sheet>();
                    foreach (var sheet in sheets)
                    {
                        var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
                        var sharedStringPart = workbookPart.SharedStringTablePart;
                        //var values = sharedStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();

                        string text;
                        var rows = worksheetPart.Worksheet.Descendants<Row>();
                        foreach (var row in rows)
                        {
                            Console.WriteLine();
                            int count = row.Elements<Cell>().Count();

                            foreach (Cell c in row.Elements<Cell>())
                            {

                                text = c.CellValue.InnerText;

                                Console.Write(text + " ");

                            }
                        }
                    }
                }

                Console.ReadLine();
            }

解决方案

Your approach seemed to work ok for me - in that it did "enter the loop". Nevertheless you could also try something like the following:

void Main()
{
    string fileName = @"c:\path\to\my\file.xlsx";

    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))
        {
            WorkbookPart workbookPart = doc.WorkbookPart;
            SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
            SharedStringTable sst = sstpart.SharedStringTable;

            WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
            Worksheet sheet = worksheetPart.Worksheet;

            var cells = sheet.Descendants<Cell>();
            var rows = sheet.Descendants<Row>();

            Console.WriteLine("Row count = {0}", rows.LongCount());
            Console.WriteLine("Cell count = {0}", cells.LongCount());

            // One way: go through each cell in the sheet
            foreach (Cell cell in cells)
            {
                if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                {
                    int ssid = int.Parse(cell.CellValue.Text);
                    string str = sst.ChildElements[ssid].InnerText;
                    Console.WriteLine("Shared string {0}: {1}", ssid, str);
                }
                else if (cell.CellValue != null)
                {
                    Console.WriteLine("Cell contents: {0}", cell.CellValue.Text);
                }
             }

             // Or... via each row
             foreach (Row row in rows)
             {
                 foreach (Cell c in row.Elements<Cell>())
                 {
                     if ((c.DataType != null) && (c.DataType ==           CellValues.SharedString))
                     {
                         int ssid = int.Parse(c.CellValue.Text);
                         string str = sst.ChildElements[ssid].InnerText;
                         Console.WriteLine("Shared string {0}: {1}", ssid, str);
                     }
                     else if (c.CellValue != null)
                     {
                         Console.WriteLine("Cell contents: {0}", c.CellValue.Text);
                     }
                 }
             }
         }
     }
 }

I used the filestream approach to open the workbook because this allows you to open it with shared access - so that you can have the workbook open in Excel at the same time. The Spreadsheet.Open(... method won't work if the workbook is open elsewhere.

Perhaps that is why your code didn't work.

Note, also, the use of the SharedStringTable to get the cell text where appropriate.

这篇关于从Excel文件中的Open XML阅读的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆