怎么遍历Excel文件的每个sheet页?

时间:2021-10-21 19:56:32
百度搜到的都是dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);不是很明白什么意思。。。
还有就是Excel.Application xApp=new Excel.ApplicationClass(); ,但是怎么导入using Excel包呢?

13 个解决方案

#1


上面那种将 EXCEL 文件当成数据库连接后, 找出所有表的功能, 每个SHEET就是一个表, 但是其他的也可能是表.
下面是按照EXCEL本身的方式来操作, 引入 Microsoft.Office.Interop.Excel 后可用.

#2



/// <summary>
        /// 获取Excel表格中所有表格名字
        /// </summary>
        /// <param name="path">表格路径</param>
        /// <returns></returns>
        public string[] GetExcelSheetNames(string path)
        {
            //1.定义Excel Application对象
            Microsoft.Office.Interop.Excel.Application Excel_App = new Microsoft.Office.Interop.Excel.Application();
            //2.定义Workbook工作簿集合对象
            Microsoft.Office.Interop.Excel.Workbooks Excel_workbooks;
            //3.定义Excel workbook工作簿对象
            Microsoft.Office.Interop.Excel.Workbook Excel_workbook;
            //4.定义Workbook工作表对象
            //Microsoft.Office.Interop.Excel.Worksheet Excel_worksheet;
            try
            {
                Excel_workbooks = Excel_App.Workbooks;
                Excel_workbook = Excel_workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Excel_App.Visible = false;
                string[] names = new string[Excel_workbook.Worksheets.Count];
                for (int i = 0; i < Excel_workbook.Worksheets.Count; i++)
                {
                    names[i] = ((Microsoft.Office.Interop.Excel.Worksheet)Excel_workbook.Worksheets[i + 1]).Name;
                }
                Excel_App.ActiveWorkbook.Close(); //关闭当前活动的WorkBook
                Excel_App.Quit();//退出excel应用程序
                return names;
            }
            catch
            {
                Excel_App.ActiveWorkbook.Close();
                Excel_App.Quit();
                DevExpress.XtraEditors.XtraMessageBox.Show("获取工作表名失败!", "提示");
                return null;
            }
        }

#3


一,返回的DataTable中有一个TABLE_NAME列,里面放的是表名。
foreach (DataRow dr in dt.Rows)
{
       Console.WriteLine(dr["TABLE_NAME"].ToString());
}

二,引用:Microsoft.Office.Interop.Excel

#4


Oledb的话,每个sheet是一个表

#5


引用 3 楼 qbilbo的回复:
一,返回的DataTable中有一个TABLE_NAME列,里面放的是表名。
foreach (DataRow dr in dt.Rows)
{
       Console.WriteLine(dr["TABLE_NAME"].ToString());
}

二,引用:Microsoft.Office.Interop.Excel

具体要怎么引用office的那个包?直接using不行8

#6


在VS的菜单:项目->添加引用,在弹出的对话框里找。
using其实只是让你写代码时不用把命名空间带上,并不会帮你引用类库。

#7


首先,一般我们玩xls都用npoi...而不是用自带的组件..

如果你用NPOI获取sheet以及读取sheet就非常简单了..


HSSFWorkbook.NumberOfSheets

上面方法表示 当前xls里面有多少个sheet.

然后获取每个sheet就用下面一句话就搞定了.


ISheet sheet = hssfworkbook.GetSheetAt(0);


其中参数表示索引...想获取哪个写哪个...

#8


我前段时间做上传excel的时候用到了
 DataTable dataTabel = Conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
但是没有用到Excel.Application xApp=new Excel.ApplicationClass();
我是这样做的:
我是在前台放了一个FileUpload和button控件,在后台通过按钮事件,将excel上传到服务器上。
再用DataTable dataTabel = Conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });读取整个excel。
我为了找到dataTabel 中哪个字段才是存放sheet表名称的。所以用下面这句输出语句。
Response.Write(dataTabel.Columns[0].ColumnName + "&" + dataTabel.Columns[1].ColumnName + "&" + dataTabel.Columns[2].ColumnName + "&" + dataTabel.Columns[3].ColumnName + "&" + dataTabel.Columns[4].ColumnName + "&" + dataTabel.Columns[5].ColumnName + "&" + dataTabel.Columns[6].ColumnName + "&" + dataTabel.Columns[7].ColumnName + "&" + dataTabel.Columns[8].ColumnName);
发现dataTabel.Columns[2].ColumnName字段名叫TABLE_NAME。是sheet表名称。你可以通过这个字段去遍历。

#9


引用 7 楼 by_封爱的回复:
首先,一般我们玩xls都用npoi...而不是用自带的组件..

如果你用NPOI获取sheet以及读取sheet就非常简单了..


HSSFWorkbook.NumberOfSheets

上面方法表示 当前xls里面有多少个sheet.

然后获取每个sheet就用下面一句话就搞定了.


ISheet sheet = hssfworkbook.GetSheetAt(0);


其中参数表示索引...想获取哪个写哪个...

怎么才能用npoi呢?没接触过。。。

#10


引用 6 楼 qbilbo的回复:
在VS的菜单:项目->添加引用,在弹出的对话框里找。
using其实只是让你写代码时不用把命名空间带上,并不会帮你引用类库。

多谢,现在去试试,,,,,

#11


没那么复杂,excel可以看作一个sql数据库,sheet可以看作是这个数据库的表。这样,问题变成了:获取数据库中各个表名,然后循环对每个表进行操作
先自己试着解决问题,不行再问

#12


将excel表看成是OLEDB数据库库

#13


引用 2 楼 SCGH_Fx 的回复:

/// <summary>
        /// 获取Excel表格中所有表格名字
        /// </summary>
        /// <param name="path">表格路径</param>
        /// <returns></returns>
        public string[] GetExcelSheetNames(string path)
        {
            //1.定义Excel Application对象
            Microsoft.Office.Interop.Excel.Application Excel_App = new Microsoft.Office.Interop.Excel.Application();
            //2.定义Workbook工作簿集合对象
            Microsoft.Office.Interop.Excel.Workbooks Excel_workbooks;
            //3.定义Excel workbook工作簿对象
            Microsoft.Office.Interop.Excel.Workbook Excel_workbook;
            //4.定义Workbook工作表对象
            //Microsoft.Office.Interop.Excel.Worksheet Excel_worksheet;
            try
            {
                Excel_workbooks = Excel_App.Workbooks;
                Excel_workbook = Excel_workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Excel_App.Visible = false;
                string[] names = new string[Excel_workbook.Worksheets.Count];
                for (int i = 0; i < Excel_workbook.Worksheets.Count; i++)
                {
                    names[i] = ((Microsoft.Office.Interop.Excel.Worksheet)Excel_workbook.Worksheets[i + 1]).Name;
                }
                Excel_App.ActiveWorkbook.Close(); //关闭当前活动的WorkBook
                Excel_App.Quit();//退出excel应用程序
                return names;
            }
            catch
            {
                Excel_App.ActiveWorkbook.Close();
                Excel_App.Quit();
                DevExpress.XtraEditors.XtraMessageBox.Show("获取工作表名失败!", "提示");
                return null;
            }
        }
  原来worksheet的索引是从1开始的啊,我说sheets【0】不行呢

#1


上面那种将 EXCEL 文件当成数据库连接后, 找出所有表的功能, 每个SHEET就是一个表, 但是其他的也可能是表.
下面是按照EXCEL本身的方式来操作, 引入 Microsoft.Office.Interop.Excel 后可用.

#2



/// <summary>
        /// 获取Excel表格中所有表格名字
        /// </summary>
        /// <param name="path">表格路径</param>
        /// <returns></returns>
        public string[] GetExcelSheetNames(string path)
        {
            //1.定义Excel Application对象
            Microsoft.Office.Interop.Excel.Application Excel_App = new Microsoft.Office.Interop.Excel.Application();
            //2.定义Workbook工作簿集合对象
            Microsoft.Office.Interop.Excel.Workbooks Excel_workbooks;
            //3.定义Excel workbook工作簿对象
            Microsoft.Office.Interop.Excel.Workbook Excel_workbook;
            //4.定义Workbook工作表对象
            //Microsoft.Office.Interop.Excel.Worksheet Excel_worksheet;
            try
            {
                Excel_workbooks = Excel_App.Workbooks;
                Excel_workbook = Excel_workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Excel_App.Visible = false;
                string[] names = new string[Excel_workbook.Worksheets.Count];
                for (int i = 0; i < Excel_workbook.Worksheets.Count; i++)
                {
                    names[i] = ((Microsoft.Office.Interop.Excel.Worksheet)Excel_workbook.Worksheets[i + 1]).Name;
                }
                Excel_App.ActiveWorkbook.Close(); //关闭当前活动的WorkBook
                Excel_App.Quit();//退出excel应用程序
                return names;
            }
            catch
            {
                Excel_App.ActiveWorkbook.Close();
                Excel_App.Quit();
                DevExpress.XtraEditors.XtraMessageBox.Show("获取工作表名失败!", "提示");
                return null;
            }
        }

#3


一,返回的DataTable中有一个TABLE_NAME列,里面放的是表名。
foreach (DataRow dr in dt.Rows)
{
       Console.WriteLine(dr["TABLE_NAME"].ToString());
}

二,引用:Microsoft.Office.Interop.Excel

#4


Oledb的话,每个sheet是一个表

#5


引用 3 楼 qbilbo的回复:
一,返回的DataTable中有一个TABLE_NAME列,里面放的是表名。
foreach (DataRow dr in dt.Rows)
{
       Console.WriteLine(dr["TABLE_NAME"].ToString());
}

二,引用:Microsoft.Office.Interop.Excel

具体要怎么引用office的那个包?直接using不行8

#6


在VS的菜单:项目->添加引用,在弹出的对话框里找。
using其实只是让你写代码时不用把命名空间带上,并不会帮你引用类库。

#7


首先,一般我们玩xls都用npoi...而不是用自带的组件..

如果你用NPOI获取sheet以及读取sheet就非常简单了..


HSSFWorkbook.NumberOfSheets

上面方法表示 当前xls里面有多少个sheet.

然后获取每个sheet就用下面一句话就搞定了.


ISheet sheet = hssfworkbook.GetSheetAt(0);


其中参数表示索引...想获取哪个写哪个...

#8


我前段时间做上传excel的时候用到了
 DataTable dataTabel = Conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
但是没有用到Excel.Application xApp=new Excel.ApplicationClass();
我是这样做的:
我是在前台放了一个FileUpload和button控件,在后台通过按钮事件,将excel上传到服务器上。
再用DataTable dataTabel = Conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });读取整个excel。
我为了找到dataTabel 中哪个字段才是存放sheet表名称的。所以用下面这句输出语句。
Response.Write(dataTabel.Columns[0].ColumnName + "&" + dataTabel.Columns[1].ColumnName + "&" + dataTabel.Columns[2].ColumnName + "&" + dataTabel.Columns[3].ColumnName + "&" + dataTabel.Columns[4].ColumnName + "&" + dataTabel.Columns[5].ColumnName + "&" + dataTabel.Columns[6].ColumnName + "&" + dataTabel.Columns[7].ColumnName + "&" + dataTabel.Columns[8].ColumnName);
发现dataTabel.Columns[2].ColumnName字段名叫TABLE_NAME。是sheet表名称。你可以通过这个字段去遍历。

#9


引用 7 楼 by_封爱的回复:
首先,一般我们玩xls都用npoi...而不是用自带的组件..

如果你用NPOI获取sheet以及读取sheet就非常简单了..


HSSFWorkbook.NumberOfSheets

上面方法表示 当前xls里面有多少个sheet.

然后获取每个sheet就用下面一句话就搞定了.


ISheet sheet = hssfworkbook.GetSheetAt(0);


其中参数表示索引...想获取哪个写哪个...

怎么才能用npoi呢?没接触过。。。

#10


引用 6 楼 qbilbo的回复:
在VS的菜单:项目->添加引用,在弹出的对话框里找。
using其实只是让你写代码时不用把命名空间带上,并不会帮你引用类库。

多谢,现在去试试,,,,,

#11


没那么复杂,excel可以看作一个sql数据库,sheet可以看作是这个数据库的表。这样,问题变成了:获取数据库中各个表名,然后循环对每个表进行操作
先自己试着解决问题,不行再问

#12


将excel表看成是OLEDB数据库库

#13


引用 2 楼 SCGH_Fx 的回复:

/// <summary>
        /// 获取Excel表格中所有表格名字
        /// </summary>
        /// <param name="path">表格路径</param>
        /// <returns></returns>
        public string[] GetExcelSheetNames(string path)
        {
            //1.定义Excel Application对象
            Microsoft.Office.Interop.Excel.Application Excel_App = new Microsoft.Office.Interop.Excel.Application();
            //2.定义Workbook工作簿集合对象
            Microsoft.Office.Interop.Excel.Workbooks Excel_workbooks;
            //3.定义Excel workbook工作簿对象
            Microsoft.Office.Interop.Excel.Workbook Excel_workbook;
            //4.定义Workbook工作表对象
            //Microsoft.Office.Interop.Excel.Worksheet Excel_worksheet;
            try
            {
                Excel_workbooks = Excel_App.Workbooks;
                Excel_workbook = Excel_workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Excel_App.Visible = false;
                string[] names = new string[Excel_workbook.Worksheets.Count];
                for (int i = 0; i < Excel_workbook.Worksheets.Count; i++)
                {
                    names[i] = ((Microsoft.Office.Interop.Excel.Worksheet)Excel_workbook.Worksheets[i + 1]).Name;
                }
                Excel_App.ActiveWorkbook.Close(); //关闭当前活动的WorkBook
                Excel_App.Quit();//退出excel应用程序
                return names;
            }
            catch
            {
                Excel_App.ActiveWorkbook.Close();
                Excel_App.Quit();
                DevExpress.XtraEditors.XtraMessageBox.Show("获取工作表名失败!", "提示");
                return null;
            }
        }
  原来worksheet的索引是从1开始的啊,我说sheets【0】不行呢