读取EXCEL的方法(用范围区域读取数据)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Diagnostics;

private void OpenExcel(string strFileName)
        {
            object missing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//启动Excel应用程序
            if (excel == null)
            {
                System.Web.HttpContext.Current.Response.Write("<script>alert('Can't access excel')</script>");
            }
            else
            {
                excel.Visible = false;//对象是否可见
                excel.UserControl = true;//如果应用程序可见或者由用户创建或启动,则为true。 如果您使用CreateObject或GetObject函数以编程方式创建或启动应用程序,并且隐藏应用程序,则为False。

                #region 以只读的形式打开EXCEL文件
                ///Workbook: 代表一个Microsoft Excel工作簿。
                ///Workbook Open方法打开一个打开一个工作簿。
                ///参数表:
                ///string Filename:文件名,要打开的工作簿的文件名。
                ///object UpdateLinks = Type.Missing:可选对象。指定文件中链接的更新方式。如果省略此参数,则会提示用户指定如何更新链接。否则,该参数是下表中列出的值之一。如果Microsoft Excel以WKS,WK1或WK3格式打开文件,并且UpdateLinks参数是2,Microsoft Excel将从附加到该文件的图表生成图表。如果参数为0,则不创建图表。
                ///object ReadOnly = Type.Missing:可选对象。如果是以只读模式打开工作簿。
                ///object Format = Type.Missing:可选对象。如果Microsoft Excel正在打开文本文件,则此参数将指定分隔符,如下表所示。如果省略此参数,则使用当前分隔符。
                ///object Password = Type.Missing:可选对象。包含打开受保护工作簿所需密码的字符串。如果省略此参数并且工作簿需要密码,则会提示用户输入密码。
                ///object WriteResPassword = Type.Missing:可选对象。包含写入写保护工作簿所需密码的字符串。如果省略此参数并且工作簿需要密码,则会提示用户输入密码。
                ///object IgnoreReadOnlyRecommended = Type.Missing:可选对象。如果Microsoft Excel不显示只读推荐消息(如果工作簿是使用“只读推荐”选项保存的),则为真。
                ///object Origin = Type.Missing:可选对象。如果该文件是一个文本文件,则该参数指示它来自何处(以便代码页和回车/换行符(CR / LF)可以正确映射)。可以是以下Microsoft.Office.Interop.Excel.XlPlatform常量之一:xlMacintosh,xlWindows或xlMSDOS。如果省略此参数,则使用当前的操作系统。
                ///object Delimiter = Type.Missing:可选对象。如果该文件是一个文本文件,并且Format参数是6,则该参数是一个字符串,它指定要用作分隔符的字符。例如,使用Chr(9)作为制表符,使用“,”作为逗号,使用“;”分号,或使用自定义字符。只使用字符串的第一个字符。
                ///object Editable = Type.Missing:可选对象。如果该文件是Microsoft Excel 4.0加载项,则此参数为True以打开加载项,以便它是一个可见的窗口。如果此参数为False或省略,加载项被打开为隐藏,并且它不能被隐藏。此选项不适用于在Microsoft Excel 5.0或更高版本中创建的加载项。如果该文件是Excel模板,请使用True为打开指定的模板进行编辑或False以基于指定的模板打开新的工作簿。默认值是False。
                ///object Notify = Type.Missing:可选对象。如果无法以读/写模式打开文件,则该参数为True,将文件添加到文件通知列表中。 Microsoft Excel将以只读方式打开文件,轮询文件通知列表,然后在文件变得可用时通知用户。如果此参数为False或省略,则不会请求通知,并且任何尝试打开不可用的文件都将失败。
                ///object Converter = Type.Missing:可选对象。打开文件时第一个文件转换器的索引。首先尝试指定的文件转换器;如果此转换器不能识别该文件,则尝试所有其他转换器。转换器索引由Microsoft.Office.Interop.Excel._Application.this [System.Object,System.Object]属性返回的转换器的行号组成。
                ///object AddToMru = Type.Missing:可选对象。如果要将此工作簿添加到最近使用的文件列表中,则为true。默认值为False。
                ///object Local = Type.Missing:可选对象。 True将文件保存为Microsoft Excel的语言(包括控制面板设置)。 False(默认值)将文件保存为Visual Basic for Applications(VBA)(通常为UU),除非WorkbeniesOpen运行的VBA项目是旧的国际化XL5 / 95 VBA项目。
                ///object CorruptLoad = Type.Missing:可选对象。 可以是以下常量之一:xlNormalLoad,xlRepairFile,和xlExtractData。 如果没有指定值,默认行为通常是正常的,但如果Excel已经尝试打开文件,则可能是安全加载或数据恢复。 第一次尝试是正常的。 如果Excel在打开文件时停止运行,则第二次尝试是安全加载。 如果Excel再次停止运行,则下一次尝试是数据恢复。
                #endregion
                Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing,missing, missing, missing, true, missing, missing, missing, missing, missing);

                #region 取得第1个工作薄
                ///Worksheets:返回一个代表指定工作簿中所有工作表的Microsoft.Office.Interop.Excel.Sheets集合。 只读表格对象。
                #endregion
                Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);

                #region 取得总记录行数(包括标题列)
                ///UsedRange:返回一个Microsoft.Office.Interop.Excel.Range对象,该对象表示指定工作表上使用的范围。 只读。
                ///Cells:返回一个Range对象,它表示指定范围内的单元格。
                ///Rows返回表示指定范围内的行的Microsoft.Office.Interop.Excel.Range对象。
                ///Count:返回集合中的对象数量。
                #endregion
                int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
                int columnsint = ws.UsedRange.Cells.Columns.Count;//得到列数

                //取得数据范围区域 (不包括标题列)
                //Range:表示单元格、行、列、包含一个或多个相邻单元格块或三维范围的单元格的选择。 
                Range rng1 = ws.Cells.get_Range("B2", "B" + rowsint);   //item

                Range rng2 = ws.Cells.get_Range("K2", "K" + rowsint); //Customer

                object[,] arryItem = (object[,])rng1.Value2;   //获取范围的值
                object[,] arryCus = (object[,])rng2.Value2;

                //将新值赋给一个数组
                string[,] arry = new string[rowsint - 1, 2];
                for (int i = 1; i <= rowsint - 1; i++)
                {
                    //Item_Code列
                    arry[i - 1, 0] = arryItem[i, 1].ToString();
                    //Customer_Name列
                    arry[i - 1, 1] = arryCus[i, 1].ToString();
                }
                System.Web.HttpContext.Current.Response.Write(arry[0, 0] + " / " + arry[0, 1] + "#" + arry[rowsint - 2, 0] + " / " + arry[rowsint - 2, 1]);
            }
            excel.Quit(); excel = null;//退出Microsoft Excel

            System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("excel");

            foreach (Process pro in procs)
            {
                pro.Kill();//没有更好的方法,只有杀掉进程
            }
            GC.Collect();
        }

  

引用:

 

posted @ 2017-11-09 16:44  巫居树  阅读(4503)  评论(0编辑  收藏  举报