似乎我无法打开一些excel sheets来导入我的datagridview。
这是我的代码。
下面的代码是我的连接字符串。我正在使用OLEDB 12.0
public static void ReadExcel(ComboBox cboSheet)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files| *.xls; *xlsx";
openFileDialog.ShowDialog();
if (!string.IsNullOrEmpty(openFileDialog.FileName))
{
OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");
OleDbcon.Open();
DataTable dt = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbcon.Close();
cboSheet.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
String sheetName = dt.Rows[i]["Table_Name"].ToString();
sheetName = sheetName.Substring(0, sheetName.Length - 1);
cboSheet.Items.Add(sheetName);
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
下面的代码用于将工作表导入我的组合框,一旦选中,将更改datagridview,包括列和行。
public static void cboSheetSelected (DataGridView dataGridView1, ComboBox cboSheet, ComboBox cboColumn)
{
try
{
OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + cboSheet.Text + "$]", ExcelMethods.OleDbcon);
DataTable dt = new DataTable();
oleAdapt.Fill(dt);
dataGridView1.DataSource = dt;
cboColumn.Items.Clear();
foreach (DataColumn column in dt.Columns)
{
Console.WriteLine(column.ColumnName);
cboColumn.Items.Add(column.ColumnName);
FileStream fs = new FileStream(@"C:\brandon\sample.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine(column.ColumnName);
//sw.WriteLine(column.Table.TableName + "" + "sample");
sw.Flush();
sw.Close();
//Console.WriteLine(column.Table);
}
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.WriteLine(item);
FileStream fs = new FileStream(@"C:\brandon\sample.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine(item);
sw.Flush();
sw.Close();
}
}
}
catch (Exception e )
{
MessageBox.Show(e.ToString());
}
}
现在,为什么我不能打开一些床单呢?
我可以打开床单:
综合
分发
国内
财务
组织
生产
质量
很好。
我无法打开包含特殊字符的表格,例如“逗号和美元符号”。
请参阅此image。
答案 0 :(得分:-1)
编辑:
Excel使用户无法访问隐藏的工作表。它们被称为_xlnm_$_FilterDatabase
。
我的代码在上一次修订版中似乎有问题,所以我 更新 。
我无法访问所述表单的原因是因为它们包含空格并且具有特殊字符&#34; $&#34;和&#34; &#39; &#34; &lt; --- 撇号 。
工作表名称的结果是这样的。
xlnm _#_ FilterDatabas
xlnm _#_ FilterDatabas
xlnm _#_ FilterDatabas
xlnm _#_ FilterDatabas
xlnm _# FilterDatabase
xlnm _#_ FilterDatabase_1
xlnm _#_ FilterDatabase_1
xlnm _# FilterDatabase
xlnm _#_ _ FilterDatabase_2
xlnm _# FilterDatabase
xlnm _#_ _ FilterDatabase_3
xlnm _# FilterDatabase
&#39; AR Aging $
&#39; By Brands - SMS $
&#39; By Brands $
&#39;按地区或渠道$
综合
分发
国内
财务
组织
生产
质量
&#39;工作资金$
就是这样,因为我已经使用了这段代码:sheetName = sheetName.Substring(0, sheetName.Length - 1);
而且我已经用&#34; $&#34;忽略了所有的工作表名称。使用此
if (!dt.Rows[i]["Table_Name"].ToString().Contains("FilterDatabase") && !dt.Rows[i]["Table_Name"].ToString().EndsWith("$'"))
{
}
特别是dt.Rows[i]["Table_Name"].ToString().EndsWith("$'"))
,以便它可以忽略带有&#34; $&#34;在它上面的标志因此使空格的表格无法访问。
我已使用此代码解决此问题:
sheetName = sheetName.Replace(@"'", "");
sheetName = sheetName.Replace("$", "");
通过使用上面的代码,名为'By Territory or Channel$
的sheetName将变为By Territory or Channel
。
因此,当它们被引用时,它看起来就像这样。
OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + sheetName + "$]", ExcelMethods.OleDbcon)