c# 32位机和64位机 读取Excel内容到DataSet

        // ----------------------32位机

        //注释说明

        //ExclePath  为Excel路径     批号  是指Excel文件中某一列必填项
        public static DataSet GetDataTableForExcel(String ExclePath)
        {
            string strCon = String.Empty;
            strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExclePath + "; Extended Properties=‘Excel 8.0;IMEX=1‘;";
            OleDbConnection olecon = new OleDbConnection(strCon);
            olecon.Open();
            DataTable dt = olecon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            string tableName = dt.Rows[0][2].ToString().Trim();
            OleDbDataAdapter myda = new OleDbDataAdapter("SELECT * FROM [" + tableName + "] Where 批号 is not null", strCon);// Where 条件根据实际情况进行更改
            DataSet myds = new DataSet();
            try
            {
                myda.Fill(myds);
            }
            catch { myds = null; }
            olecon.Close();
            return myds;
        }

        //-----------------------------64位机

        /// <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 static DataTable ExecleToDataSet(string filenameurl, int sheetIndex, string splitstr)
        {
            //
            Microsoft.Office.Interop.Excel.Workbook wb = null;
            Microsoft.Office.Interop.Excel.Worksheet ws = null;
            bool isEqual = false;//不相等
            ArrayList columnArr = new ArrayList();//列字段表
            DataSet myDs = new DataSet();
            DataTable xlsTable = myDs.Tables.Add("show");
            object missing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//lauch excel application
            if (excel != null)
            {
                excel.Visible = false;
                excel.UserControl = true;
                // 以只读的形式打开EXCEL文件
                wb = excel.Workbooks.Open(filenameurl, missing, true, missing, missing, missing,
                 missing, missing, missing, true, missing, missing, missing, missing, missing);
                //取得第一个工作薄
                ws = (Microsoft.Office.Interop.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 (((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, i]).Text.ToString() == ((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, k]).Text.ToString())
                            {
                                //如果该列的值等于前面列中某一列的值
                                xlsTable.Columns.Add(((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, i]).Text.ToString() + splitstr + (r + 1).ToString(), typeof(string));
                                columnArr.Add(((Microsoft.Office.Interop.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(((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, i]).Text.ToString(), typeof(string));
                            columnArr.Add(((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, i]).Text.ToString());
                        }
                    }
                    else
                    {
                        xlsTable.Columns.Add(((Microsoft.Office.Interop.Excel.Range)ws.Cells[1, i]).Text.ToString(), typeof(string));
                        columnArr.Add(((Microsoft.Office.Interop.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()] = ((Microsoft.Office.Interop.Excel.Range)ws.Cells[i, j]).Text.ToString();
                    }
                    xlsTable.Rows.Add(dr);
                }
            }
            excel.Quit();
            excel = null;
            Dispose(ws, wb);
            return xlsTable;
        }
时间: 2024-10-11 09:41:19

c# 32位机和64位机 读取Excel内容到DataSet的相关文章

32位机和64位机的区别及基本数据类型占字节数

一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍.但这是建立在64bit操作系统,64bit软件的基础上的. 什么是64位处理器? 之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力也是2的倍数.8位处理器.16位处理器.32位处理器和64位处理器,其计数都是2的倍数.一次处理的数据越大,该电

32位机与64位机数据大小

32位机与64位机数据大小 32位编译器: char :1个字节       char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节.同理64位编译器) short int : 2个字节 int:  4个字节 unsigned int : 4个字节 float:  4个字节 double:   8个字节 long:   4个字节 long long:  8个字节 unsigned long:  4个字节 64位编译器: char :1个字节 char*

32位程序访问64位系统上的Windows注册表

今天在工作的过程中遇到个奇怪的为问题,就是通过c#获取注册表键值的问题,一般都比较简单: string SQLPath = string.Empty; RegistryKey hkml = Registry.LocalMachine; RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer"); if (MSSQLServerKey != null) { string[] keys =

实战iOS应用从32位升级到64位

苹果官方会在2015年2月1日不允许不支持arm64的应用的提交,这对我们这种开发移动应用产品的人来说是一把达摩克利斯之剑.我前面写过一篇文章<iOS上应用如何兼容32位系统和64位系统>,但那还是纸上谈兵阶段,没有进入实战.到2015年1月份,我终于在应用提交了一次新的稳定版本后,开始进行应用的arm64升级. 1. 准备 我们的应用是多媒体的播放器,牵涉到了ffmpeg/SDL等著名的开源第三方.因为项目中并非把这些项目的源码直接引入,而是通过打库链接到项目的方式来使用,那么所有的第三方的

32位程序下调用64位函数——进程32位模式与64位模式切换

之前学习的32位进程中调用64位进程函数的知识整理一下,也就是32位模式与64位模式之间的切换. 相关博客:http://www.cnblogs.com/lanrenxinxin/p/4821152.html 这个博客中提到了github上的开源库,我在另一份开源项目中也看到了个库,可以切换32位至64位. 如果对这个功能具体实现比较感兴趣的朋友可以看看下面的内容. 我阅读了源码并进行了注释,算是对这个具体方法的分析和学习. 关键: 1.在x64下的进程,不管是32位或者是64位,实际上都映射了

C# 32位程序在64位系统下注册表操作

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突 相关资料请查看32位程序在64位系统下运行的重定向机制 下面是以获取操作系统安装密匙KEY的案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

32位程序移植64位经验

最近移植了一个32位程序到64位,原本以为简单的事,折腾了好几天,现在记录下来过程,供有相关问题的人参考:程序是一个输入法,源代码来自盒子 http://www.2ccc.com/article.asp?articleid=2850,再此感谢刘麻子大侠,输入法大量的使用了windows定义的结构体或记录类型,涉及的数据类型很多,在32到64转换的过程中参考了http://blog.csdn.net/hpjx1987/article/details/51453586,首先感谢作者共享知识,但这里有

关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)

0x00 前言 最近学习了[email protected]的文章<Persistence Architecture Matters>,恰巧解决了我之前遇到过的一个问题,理清了文件和注册表重定向中需要注意的细节 大家在学习的过程中难免也会碰到,所以在此分享一下. <Persistence Architecture Matters>的链接:https://labs.mwrinfosecurity.com/blog/persistence-architecture-matters/ 0

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个DWORD类型的UnixStamp.  但是在64位系统上有所不同(仅测试了win7.win8),默认情况下32程序在64位机器上访问的是下面这个地址HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion