2017-06-21 29 views
1

我知道这个问题有十几个答案和帖子,但没有任何适用于我的作品。'Microsoft.ace.oledb.12.0'不从服务器上的.xlsx文件读取所有行(IIS7)

我们有我的MVC4应用程序,我将它部署到IIS7到我的服务器和一台机器,我们没有安装Visual Studio。

我们正在做进口/出口数据从/到excel进行批量输入。

我们确实在Office 2007的.xlsx格式的一张工作表中有20000左右的数据(文件保存为Excel工作簿)。

现在,当我通过使用下面的代码读取数据时,它只读取4000-5000行左右的数据。

这整个下面的代码在我的本地机器在那里我做的代码和读取所有20000点的数据从“的Excel 97-2003工作簿以.xls” 但与“Excel工作簿正与的.xlsx工作正常”。

private void FillDataSet(HttpPostedFileBase file, DataSet ds) 
{ 
    using (
    var con = 
     new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" File Path";Extended Properties=Excel 12.0")) 
    { 
     con.Open(); 
     var dtSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     var strSheetName = ""; 
     strSheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();   
     var cmd = new OleDbCommand(); 
    var da = new OleDbDataAdapter(); 
    cmd.Connection = con; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "SELECT * FROM [" + strSheetName + "]"; 
    da = new OleDbDataAdapter(cmd); 
    da.Fill(ds);   
    } 
} 

我已经经历了下面的步骤和解决方案,但它不适合我。

- 安装Microsoft Access数据库引擎2010可再发行组件。

-Installing 2007 Office系统驱动程序:数据连接组件

我们搞不清为什么它的工作我的本地机器上,而不是工作的服务器。

请对这个问题..

提供任何想法或解决方案我曾尝试: - 从解决方案资源管理器中右键单击您的项目,然后单击属性。 - 单击生成选项卡 - 将平台目标更改为:任何CPU至x86 |任何CPU到x64 - 重新构建您的解决方案 - 也使用启用32位应用程序的高级设置中的IIS更改为True/False。

回答

1

一些时间,而从Excel中读取数据,你需要将所有的数据转换成文本格式

旧的连接字符串

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" File Path";Extended Properties=Excel 12.0" 

更新后的连接字符串

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" File Path";Extended Properties=Excel 12.0;HDR=YES;IMEX=1';" 

这会将所有数据转换为文本格式,所有数据将被显示。

更新的代码

private void FillDataSet(HttpPostedFileBase file, DataSet ds) 
{ 
    using (
    var con = 
     new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" File Path";Extended Properties=Excel 12.0;HDR=YES;IMEX=1';")) 
    { 
     con.Open(); 
     var dtSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     var strSheetName = ""; 
     strSheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();   
     var cmd = new OleDbCommand(); 
    var da = new OleDbDataAdapter(); 
    cmd.Connection = con; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "SELECT * FROM [" + strSheetName + "]"; 
    da = new OleDbDataAdapter(cmd); 
    da.Fill(ds);   
    } 
} 
+0

感谢Tanay更新.. 但这也没有解决我的问题。 我已经通过此链接给出的连接stirngs,但无论如何它不是整个20000记录 它只是读取4000-5000记录只有.xlsx格式 https://www.connectionstrings.com/ace-oledb -12-0/ –

+0

这是不对的。 IMEX = 1意味着提供者将混合colums作为文本对待,而不是将它视为文本。令人遗憾的是,提供商仍然会扫描前8行,并对列中的数据类型做出决定。如果没有IMEX = 1,那么它将返回Null,表示没有评估到所处理数据类型的所有内容。这不是一个问题,如果它评估它们为文本,但如果它认为它们是数字,那么你会在文本单元中得到空值。在这种情况下,IMEX = 1将返回列的前8个单元格中混合数据类型的列的文本。 –

0

试试这个。我也有一些问题。

new OleDbConnection(@"Provider=Provider=Microsoft.Jet.OLEDB.4.0;Data Source;Data Source=" File Path";Extended Properties=\"Excel 8.0;HDR=Yes;\";)) 
+1

Jet提供程序已过时,不应再使用。 –