none
EXCEL2003文件转成EXCEL2010导到dataset中,不报错,但调试的时候dataset总为空 RRS feed

  • 问题

  •     EXCEL2003导到dataset中没问题,相同内容的EXCEL2010导到dataset也没问题,但是,EXCEL2003文件转成EXCEL2010然后导到dataset中,不报错,但调试的时候dataset总为空,查不到原因,不知道是为什么
    2014年10月14日 3:32

答案

  • 你好:

    你没有告诉我们你是如何导出Excel到DataSet中去的,也没有告诉我们你是如何将Excel 2003文件转换成Excel2010的,所以问题的原因不好确定。

    1. 从Excel2003转换为Excel2010最好的办法就是通过Excel2010的另存为功能直接将xls文件保存为xlsx文件,也可以在C#语言等代码中调用Microsoft.Office.Interop.Excel的SaveAs方法来保存:

    http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.saveas(v=vs.80).aspx

    private void WorkbookSaveAs()
    {
        if (this.FileFormat == Excel.XlFileFormat.xlWorkbookNormal)
        {
            this.SaveAs(this.Path + @"\XMLCopy.xls",
                Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing,
                false, false, Excel.XlSaveAsAccessMode.xlNoChange,
                missing, missing, missing, missing, missing);
        }
    }
    

    2. 将Excel文件导出到DataSet的方法有很多种,最简单的可以通过OleDbConnection连接到Excel文件,读取所有的工作表格数据,存入DataSet, 当然也可以通过Microsoft.Office.Interop.Excel打开Excel文件,读取工作表,逐行将数据以及类型读取出来保存到DataSet中,通过OpenXML也同样可以做到,Excel2007版本以后的文件实际上是OpenXML格式的,数据格式类型等信息都保存在xml文件中,通过OpenXML SDK可以读取其中的数据以及其他信息。最后一种方式就是通过一些第三方的类库,比如NPOI, ExcelDataReader等。我这里给出一个OleDB读取方式,可以将xls或者xlsx文件导出为DataSet,我测试了一下,不管是Excel2003,Excel2010还是Excel2003转换成的Excel2010文件都可以成功读取出数据:

    public static DataSet ImportExcelXLS(string FileName, bool hasHeaders)
            {
                string HDR = hasHeaders ? "Yes" : "No";
                string strConn;
                if (FileName.Substring(FileName.LastIndexOf('.')).ToLower() == ".xlsx")
                    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
                else
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";
    
                DataSet output = new DataSet();
    
                using (OleDbConnection conn = new OleDbConnection(strConn))
                {
                    conn.Open();
    
                    DataTable schemaTable = conn.GetOleDbSchemaTable(
                        OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    
                    foreach (DataRow schemaRow in schemaTable.Rows)
                    {
                        string sheet = schemaRow["TABLE_NAME"].ToString();
    
                        if (!sheet.EndsWith("_"))
                        {
                            try
                            {
                                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                                cmd.CommandType = CommandType.Text;
    
                                DataTable outputTable = new DataTable(sheet);
                                output.Tables.Add(outputTable);
                                new OleDbDataAdapter(cmd).Fill(outputTable);
                            }
                            catch (Exception ex)
                            {
                                throw new Exception(ex.Message + string.Format("Sheet:{0}.File:F{1}", sheet, FileName), ex);
                            }
                        }
                    }
                }
                return output;
            } 


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月15日 6:01
    版主