在C#OpenXML中读取.xlsx

时间:2015-08-17 14:53:20

标签: c# gridview openxml

我试图看看是否可以通过OpenXML将.xlsx文件读入带有C#的网格视图

我是通过OleDB连接完成的,但我想尝试使用OpenXML。 gridview是采用这种方式还是其他方式我应该处理它给出的数据?

此外,如果任何人有关于使用OpenXML导入的任何进一步阅读材料,这将是方便的,因为网络目前看起来很稀疏。

编辑:

所以在下面的链接后我回来了:

  using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(xlsxFilePath, true))
            {
                //Access the main Workbook part, which contains data

                WorkbookPart workbookPart = myWorkbook.WorkbookPart;

                WorksheetPart worksheetPart = null;

                if (!string.IsNullOrEmpty(sheetName))
                {
                    Sheet ss = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).SingleOrDefault<Sheet>();

                    worksheetPart = (WorksheetPart)workbookPart.GetPartById(ss.Id);
                }
                else
                {
                    worksheetPart = workbookPart.WorksheetParts.FirstOrDefault();
                }

                SharedStringTablePart stringTablePart = workbookPart.SharedStringTablePart;

                if (worksheetPart != null)
                {
                    Row lastRow = worksheetPart.Worksheet.Descendants<Row>().LastOrDefault();

                    Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();

                    if (firstRow != null)
                    {
                        foreach (Cell c in firstRow.ChildElements)
                        {
                            string value = GetValue(c, stringTablePart);

                            dt.Columns.Add(value);
                        }
                    }

                    if (lastRow != null)
                    {
                        for (var i = 2; i <= lastRow.RowIndex; i++)
                        {
                            DataRow dr = dt.NewRow();

                            var empty = true;

                            Row row = worksheetPart.Worksheet.Descendants<Row>().Where(r => i == r.RowIndex).FirstOrDefault();

                            var j = 0;

                            if (row != null)
                            {
                                foreach (Cell c in row.ChildElements)
                                {
                                    //Get cell value

                                    string value = GetValue(c, stringTablePart);

                                    if (!string.IsNullOrEmpty(value) && value != "")
                                    {
                                        empty = false;
                                    }

                                    dr[j] = value;

                                    j++;

                                    if (j == dt.Columns.Count)
                                    {
                                        break;
                                    }
                                }

                                if (empty)
                                {
                                    break;
                                }

                                dt.Rows.Add(dr);
                            }
                        }
                    }
                }
            }

            return dt;
        }

我遇到的问题是我必须指定工作表名称 - 这可能超出了可能的范围,但是可以选择获取当前工作表名称,然后让用户单击他们想要的工作表程序阅读 - 例如弹出组合框?

1 个答案:

答案 0 :(得分:1)

在C#中操作openxml你可以使用openxml SDK(可在此处获取:https://msdn.microsoft.com/en-us/library/office/bb448854.aspx)。

对于您的问题,我不认为有嵌入式解决方案&#34; Excel2Gridview&#34;但操纵不是很困难。 通过快速查看网络,您可以找到相反的问题&#34; gridview to Excel&#34;。因此,如果您采用这样的解决方案,https://social.msdn.microsoft.com/Forums/office/en-US/20d517d0-fb70-4879-b595-71b6d57be0ae/export-grid-view-to-excel-mysql?forum=exceldev应用反向方法将您的Excel转换为gridview

<强>更新

要检索工作表名称,请查看:https://msdn.microsoft.com/en-us/library/office/bb507946.aspx

要向用户列出工作表名称,您可以创建如下表单:

  • 用于打开Excel文件的对话框
  • 检索工作表名称
  • 向用户建议名称为
  • 的组合框
  • 如果&#34;确定&#34;,请使用所选的工作表名称执行您的功能