我面临着使用oledb阅读器读取excel表的问题,第一列没有被读者返回并且在最后一列显示头部F14和列已经为空。 但是,当我打开Excel工作表并双击标题行边框进行自动调整并自动调整大小时保存excel并再次阅读,然后所有列都返回完美。
我尝试阅读使用php应用程序生成的Excel工作表,下载后我们将我的应用程序从excel读取数据,但是上面的问题来了。
我已经做了很多R& D甚至我在excel表中给出宽度,同时使用Web应用程序生成excel。我的代码就像这样
private bool Import_To_Grid(string FilePath, string Extension)
{
try
{
string conStr = "";
switch (Extension)
{
case ".xls": //Excel 97-03
conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"]
.ConnectionString;
break;
case ".xlsx": //Excel 07 and above
conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"]
.ConnectionString;
break;
}
conStr = String.Format(conStr, FilePath);
OleDbConnection connExcel = new OleDbConnection(conStr);
OleDbCommand cmdExcel = new OleDbCommand();
OleDbDataAdapter oda = new OleDbDataAdapter();
cmdExcel.Connection = connExcel;
//Get the name of First Sheet
connExcel.Open();
Exceldt = new DataTable();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
connExcel.Close();
//Read Data from First Sheet
connExcel.Open();
cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
oda.SelectCommand = cmdExcel;
oda.Fill(Exceldt);
connExcel.Close();
//Bind Data to GridView
dgv_showexcel.DataSource = Exceldt;
BindDataToCmbClass(); //binddata to class for filter
cmb_userclass.SelectedIndex = 0;
return true;
}
catch (Exception ex) { MessageBox.Show("Its Error" + " " + ex.ToString()); return false; }
}
Connection string
<add name="Excel03ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';" />
<add name="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';" />
答案 0 :(得分:0)
当我们下载锁定第一个单元格的写入模式或写入模式时,我们需要在第一列和行默认情况下为此bcz标头位置设置IMEX = 3。
答案 1 :(得分:0)
我刚刚解决了同样的问题。也许有利于人。
就我而言,excel文件包含列上的过滤器。因此,在阅读文件时,获取名为_xlnm#_FilterDatabase
的隐藏工作表。
实际上我期待一张表,所以我正在查看架构表上的第一行。但我得到两张纸,其中一张是过滤纸,这张纸不包含所有列。所以我没有得到第一列。
要解决此问题,请遍历架构并获取不包含FilterDatabase
的第一个工作表名称。
代码会谈:
DataTable excelSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = null;
for (int i = 0; i < dtExcelSchema.Rows.Count; i++)
{
string tableNameOnRow = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString();
if (!tableNameOnRow.Contains("FilterDatabase"))
{
sheetName = tableNameOnRow;
break;
}
}
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet(); cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";