您的位置:首页 > 编程语言 > C#

C# 读取Excel文件的几种方法【搜集整理】

2016-09-26 11:02 288 查看
片段 1

<pre name="code" class="csharp"><pre name="code" class="csharp"><span style="font-size:14px;">using System.Data.OleDb;
...

static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
DataTable myT=ExcelToDataTable("D:/资料.xls","sheet1");
String mystr=myT.Rows[0][0].ToString();
this.textBox1.Text=mystr;
}

public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
{
//源的定义
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

//Sql语句
//string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法
string strExcel = "select * from   [sheet1$]";

//定义存放的数据表
DataSet ds = new DataSet();

//连接数据源
OleDbConnection conn = new OleDbConnection(strConn);

conn.Open();

//适配到数据源
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);

conn.Close();

return ds.Tables[strSheetName];
}</span>




很简单的代码,但是问题就出在连接字符串上面,后面一定要加上ExtendedProperties='Excel
8.0;HDR=NO;IMEX=1',HDR和IMEX也一定要配合使用,我也不知道为什么,这样配合的效果最好,这是我艰苦调试的结果.IMEX=1应该是将所有的列全部视为文本,我也有点忘记了.至于HDR本来只是说是否要出现一行标题头而已,但是结果却会导致某些字段值丢失,所以其实我至今也搞不明白为什么,很可能是驱动的问题...


片段 2

提供两种方法:一个是直接打开excel文件,然后逐行读取,速度较慢;还有一种方法是通过OleDb连接,把excel文件作为数据源来读取。
方法一:这种直接读取单元格的方法释放很重要。

Excel.Application excel = null;
Excel.Workbooks wbs = null;
Excel.Workbook wb = null;
Excel.Worksheet ws = null;
Excel.Range range1 = null;
object Nothing = System.Reflection.Missing.Value;

try
{
excel = new Excel.Application();
excel.UserControl = true;
excel.DisplayAlerts = false;

excel.Application.Workbooks.Open(this.FilePath,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing ) ;

wbs = excel.Workbooks;
wb = wbs[1];
ws = (Excel.Worksheet)wb.Worksheets["Sheet2"];

int rowCount = ws.UsedRange.Rows.Count;
int colCount = ws.UsedRange.Columns.Count;
if (rowCount <= 0)
throw new InvalidFormatException("文件中没有数据记录");
if (colCount < 4 )
throw new InvalidFormatException("字段个数不对");

for (int i = 0;i    {

this.rowNo = i + 1;
object[] row = new object[4];
for (int j = 0;j<4;j++)
{
range1 = ws.get_Range(ws.Cells[i+2,j+1],ws.Cells[i+2,j+1]);
row[j] = range1.Value;

if (row[0] == null)
{
this.isNullRecord++;
break;
}
}

if (this.isNullRecord > 0)
continue;

DataRow dataRow = this.readExcel(row);

if (this.isNullRecord == 1)
continue;

if (this.verifyData(dataRow) == false)
errFlag++;

this.updateTableCurr(dataRow);
}

}
finally
{
if (excel != null)
{
if (wbs != null)
{
if (wb != null)
{
if (ws != null)
{
if (range1 != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
range1 = null;
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
ws = null;
}
wb.Close(false,Nothing,Nothing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
wb = null;
}
wbs.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
wbs = null;
}
excel.Application.Workbooks.Close();
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
excel = null;
GC.Collect();
}
}


方法二:里是filldataset,也可以返回OleDbDataReader来逐行,数据注:这种方法容易把混合型的字段作为null值读取进来,解决办法是改造连接字符串

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
通过Imex=1来把混合型作为文本型读取,避免null值,详细请见http://www.connectionstrings.com

<span style="font-size:14px;">strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
通过Imex=1来把混合型作为文本型读取,避免null值,详细请见http://www.connectionstrings.com
private DataSet importExcelToDataSet(string FilePath)
{
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FilePath + ";Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]",strConn);
DataSet myDataSet = new DataSet();
try
{
myCommand.Fill(myDataSet);
}
catch(Exception ex)
{
throw new InvalidFormatException("该Excel文件的工作表的名字不正确," + ex.Message);
}
return myDataSet;
}</span>


片段 3
用c#读取excel文件,写到datagridview控件中

<span style="font-size:14px;">string strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1''" " ;

OleDbConnection conn = new OleDbConnection(strconn);

conn.Open();

if (bo == false)

{

comboBox1.Items.Clear();

DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

foreach (DataRow dr in dt.Rows)

{

comboBox1.Items.Add((String)dr["TABLE_NAME"]);

//MessageBox.Show((String)dr["TABLE_NAME"]);

}

//comboBox1.Text = comboBox1.Items[0].ToString();

}

else

{

string sql = "select * from " + comboBox1.Text;

OleDbDataAdapter aper = new OleDbDataAdapter(sql, conn);

DataSet myset = new DataSet();

aper.Fill(myset, comboBox1.Text);

dataGridView1.DataSource = myset.Tables[comboBox1.Text];

}

conn.Close();</span>


注:@"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\MyExcel.xls;Extended Properties=""Excel8.0;HDR=Yes;IMEX=1"""
"HDR=Yes;" indicates that thefirst row contains columnnames, not data
"IMEX=1;" tells the driver toalways read "intermixed" data columns as text
TIP! SQL syntax: "SELECT * FROM[sheet1$]" - i.e. worksheet name followed by a "$" and wrappedin "[" "]" brackets.
如果第一行是数据而不是标题的话,应该写:
"HDR=No;"
"IMEX=1;" tells the driver toalways read "intermixed" data columns as text

片段4
Excel就像数据库,每个Sheet就是一个Table.Microsoft.Jet.OLEDB驱动.

之后是DataReader循环,或DataSet处理都非常简单. HTTP://BLOG.CSDN.NET/CRABO/ 注意:数据类型的转换!!

<span style="font-size:14px;">#region set connection
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "+this.txtPath.Text+";Extended Properties=Excel 8.0;";
myDataReader = null;
craboDbConnection = new OleDbConnection(strConn);
OleDbCommand myOleDbCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", myOleDbConnection);
#endregion

try
{
myOleDbConnection.Open();
myDataReader = myOleDbCommand.ExecuteReader();
while (myDataReader.Read())
{
this.txtSeq.Text=Convert.ToString(myDataReader.GetValue(0));//列1
this.txtName.Text=Convert.ToString(myDataReader.GetValue(1));//列2
this.txtPIN.Text=Convert.ToString(myDataReader.GetValue(2));//列3
}
}
#region Catch
catch(System.Threading.ThreadAbortException e)
{
System.Threading.Thread.ResetAbort();
this.lblResult.Text = "线程被中断..."+e.Message;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
finally
{
// Always call Close when done reading.
if (myDataReader != null)
myDataReader.Close();

// Close the connection when done with it.
if (craboDbConnection!=null && craboDbConnection.State == ConnectionState.Open)
craboDbConnection.Close();

if(webResponse!=null)
webResponse.Close();
}
#endregion
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息