zoukankan      html  css  js  c++  java
  • Asp.net操作Excel文件事例小结,基于ExtAspNet控件库

    SQL查询Excel文件的语句:
    SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source=D:\hxl\gxjt\gxjt\pay\excel\list.xls;Extended Properties=Excel 8.0; HDR=YES;

    IMEX=1')...Sheet1$

    注:如遇到如下问题:

    1)、已拒绝对 OLE DB 访问接口 'Microsoft.Jet.OLEDB.4.0' 的即席访问。必须通过链接服务器来访问此访问接口。

       答:登录数据库用户必须具有sa权限

    1.把Excel里的数据转换为DataSet
    方法一:
            /// <summary>
            /// 把Excel里的数据转换为DataSet,并返回DataSet,缺点:当Excel文件中有两列的名称一样,则第二列起名称自动在末尾加‘1’
            /// </summary>
            /// <param name="filenameurl">服务器上的路径</param>
            /// <param name="sheetname">sheet名称</param>
            /// <returns></returns>
            public DataSet ExecleToDataSet(string filenameurl, string sheetname)
            {
                string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + filenameurl + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
                OleDbConnection conn = new OleDbConnection(strConn);
                OleDbDataAdapter odda = new OleDbDataAdapter("select * from [" + sheetname + "$]", conn);
                DataSet ds = new DataSet();
                odda.Fill(ds, sheetname);
                return ds;
            }
    注:当Excel文件中有两列的名称一样,则第二列起名称自动在末尾加'1'

    方法二:
            /// <summary>
            /// 把Excel里的数据转换为DataTable,应用引用的com组件:Microsoft.Office.Interop.Excel.dll 读取EXCEL文件
            /// </summary>
            /// <param name="filenameurl">物理路径</param>
            /// <param name="sheetIndex">sheet名称的索引</param>
            /// <param name="splitstr">如果是已存在列,则自定义添加的字符串</param>
            /// <returns></returns>
            public DataTable ExecleToDataSet(string filenameurl, int sheetIndex, string splitstr)
            {
                //
                bool isEqual = false;//不相等
                ArrayList columnArr = new ArrayList();//列字段表

                DataSet myDs = new DataSet();
                DataTable xlsTable = myDs.Tables.Add("show");

                object missing = System.Reflection.Missing.Value;
                Excel.ApplicationClass excel = new Excel.ApplicationClass();//lauch excel application
                if (excel == null)
                {
                    Alert.Show("不能进入excel!");
                }
                else
                {
                    excel.Visible = false;
                    excel.UserControl = true;
                    // 以只读的形式打开EXCEL文件
                    Excel.Workbook wb = excel.Workbooks.Open(filenameurl, missing, true, missing, missing, missing,
                     missing, missing, missing, true, missing, missing, missing, missing, missing);
                    //取得第一个工作薄
                    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.get_Item(sheetIndex);

                    //取得总记录行数(包括标题列)
                    int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
                    int columnsint = ws.UsedRange.Cells.Columns.Count;//得到列数

                    DataRow dr;
                    for (int i = 1; i <= columnsint; i++)
                    {
                        //判断是否有列相同
                        if (i >= 2)
                        {
                            int r = 0;
                            for (int k = 1; k <= i - 1; k++)//列从第一列到第i-1列遍历进行比较
                            {
                                if (((Excel.Range)ws.Cells[1, i]).Text.ToString() == ((Excel.Range)ws.Cells[1, k]).Text.ToString())
                                {
                                    //如果该列的值等于前面列中某一列的值
                                    xlsTable.Columns.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString() + splitstr + (r+1).ToString(), typeof(string));
                                    columnArr.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString() + splitstr + (r + 1).ToString());
                                    isEqual = true;
                                    r++;
                                    break;
                                }
                                else
                                {
                                    isEqual = false;
                                    continue;
                                }
                            }
                            if (!isEqual)
                            {
                                xlsTable.Columns.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString(), typeof(string));
                                columnArr.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString());
                            }

                        }
                        else
                        {
                            xlsTable.Columns.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString(), typeof(string));
                            columnArr.Add(((Excel.Range)ws.Cells[1, i]).Text.ToString());
                        }
                    }

                    for (int i = 2; i <= rowsint; i++)
                    {
                        dr = xlsTable.NewRow();
                        for (int j = 1; j <= columnsint; j++)
                        {
                            dr[columnArr[j - 1].ToString()] = ((Excel.Range)ws.Cells[i, j]).Text.ToString();
                        }
                        xlsTable.Rows.Add(dr);
                    }
                }
                excel.Quit();
                excel = null;
                System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("EXCEL");

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


    2.获取Excel文件的Sheet名称,并邦定到DropDownList

    /*要引入命空间

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;
    using System.Reflection;

    */
     [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int id);
            /// <summary>
            /// 获取Excel文件的Sheet名称,并邦定到DropDownList
            /// </summary>
            /// <param name="FileFullName">服务器,物理路径 </param>
            protected void ExcelSheetToBind(string FileFullName)
            {
                string[] SplitString = FileFullName.Split('\\');
                string FileName = SplitString[SplitString.Length - 1].ToString();
                Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
                Excel.Workbook oBook = oExcel.Workbooks.Open(FileFullName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,

    Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                try
                {
                    DropDownList_datetable.Items.Clear();
                    DropDownList_datetable.Items.Add("请选择工作表", "0");
                    foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in oBook.Sheets)
                    {
                        DropDownList_datetable.Items.Add(new ExtAspNet.ListItem(sheet.Name, sheet.Name));
                    }
                }
                catch
                {
                }
                finally
                {
                    IntPtr t = new IntPtr(oExcel.Hwnd);
                    int k = 0;
                    GetWindowThreadProcessId(t, out k);
                    System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
                    p.Kill();
                }
            }

  • 相关阅读:
    二维动规思想,j 具有明显枚举特征
    二分法题目总结
    最大(小)值最小(大)化 (二分法变形)
    C/ C++ 输入输出流
    正序扫描字符串问题
    React(基础一)_react中的三大属性
    找位置
    STL vector
    STL stack
    打印日期
  • 原文地址:https://www.cnblogs.com/llyfe2006/p/1847638.html
Copyright © 2011-2022 走看看