如何使用microsoft.office.interop.excel在c#中只获取一次excel文件的合并单元格

时间:2015-03-17 06:43:37

标签: c# asp.net asp.net-mvc-4 office-interop excel-interop

我正在使用microsoft.office.interop.excel在C#中读取excel文件。当文件合并了单元格时,它通过包含合并单元格中的单元格数来循环,而我想立即合并区域

这是我的方法

public void ImportXLX()
    {
        Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

        Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Open(@"C:\Users\Vipin\Desktop\Sheets\MyXL6.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);

        int workSheetCounts = wb.Worksheets.Count;

        for (int sheetCounter = 1; sheetCounter <= workSheetCounts; sheetCounter++)
        {
            Microsoft.Office.Interop.Excel.Worksheet workSheet = wb.Sheets[sheetCounter];

            Range excelRange = workSheet.UsedRange;
            Range objRange = null;

            int rowCount = 0;
            float totalRowWidth = 0;
            foreach (Microsoft.Office.Interop.Excel.Range row in excelRange.Rows)
            {
                rowCount++;
                totalRowWidth = row.Width;
                int colCount = 0;

                foreach (Microsoft.Office.Interop.Excel.Range c in row.Cells)
                {
                    colCount++;
                    objRange = workSheet.Cells[rowCount, colCount];

                    double width = 0;
                    double height = 0;
                    string colVal = null;

                    if (objRange.MergeCells)
                    {
                        colVal = Convert.ToString(((Range)objRange.MergeArea[1, 1]).Text).Trim();
                        width = objRange.MergeArea.Width;
                        height = objRange.MergeArea.Height;


                    }
                    else
                    {
                        colVal = Convert.ToString(objRange.Text).Trim();
                        width = objRange.Width;
                        height = objRange.Height;
                    }
                    Debug.Write("objRange = " + objRange + " rowCount = " + rowCount + " Width = " + width + " height = " + height + "TotalColumnWidth = " + totalRowWidth + "TotalRowHeight = " + totalColHeight + " \n ");
                }
            }
        }
        app.Quit();
    }

enter image description here

这是excel文件截图

在这个我希望[3,1] [4,1] [5,1] [6,1] [7,1] [8,1] [9,1]细胞只进行一次完整宽度和高度

1 个答案:

答案 0 :(得分:0)

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。

您可以在Considerations for server-side Automation of Office文章中详细了解相关内容。您可以考虑使用Open XML SDK或为服务器端执行而设计的任何其他第三方组件。有关详细信息,请参阅Welcome to the Open XML SDK 2.5 for Office