不知道为什么就是上传来的EXCLE文件就里面的中文读取的时候都是空的,数字与英文就没有问题!各位帮忙看下!
第一个:
事件:
#region 显示EXCEL内容
/// <summary>
/// 显示EXCEL内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void SelectExc(object sender, AjaxEventArgs e)
{
DataTable dt = GetDataTable(hid_filePath.Text, cmb_tableName.SelectedItem.Value);//路径与EXCLE中SHEEL名
StoreDatabing.DataSource = dt;
StoreDatabing.DataBind();
}
#endregion
#region 封装数据
private DataTable GetDataTable(string filePath, string tableName)
{
ExcelReader reader = null;
reader = new ExcelReader();
reader.Path = filePath;
reader.TableName = tableName;
reader.OpenExcel();
DataTable dt = reader.GetTable();
return dt;
}
#endregion
using System;
using System.Data;
using System.Data.OleDb;
namespace Bo
{
/// <summary>
/// 读取Excel文件,并转换成DataTable对象。
/// </summary>
public class ExcelReader : IDisposable
{
protected OleDbConnection _conn;
protected OleDbDataAdapter _da;
protected DataTable _dt;
protected string _connString;
protected string _sql;
/// <summary>
/// 构造函数,初始化数据库连接对象;
/// </summary>
public ExcelReader()
{
_conn = new OleDbConnection();
_connString = "";
_sql = "";
}
public ExcelReader( string connString )
{
_conn = new OleDbConnection( );
_connString = connString;
_sql = "";
}
/// <summary>
/// 设置Excel文件的所在路径。
/// </summary>
public string Path
{
set
{
_connString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + value + "; Extended Properties=Excel 8.0;";
}
}
/// <summary>
/// 设置Excel文件中的表的名称,一般为[sheet1$]
/// </summary>
public string TableName
{
set{ _sql = "select * from [" + value + "]"; }
}
/// <summary>
/// 打开Excel文件。
/// </summary>
public void OpenExcel()
{
if( _connString == "" ) throw new Exception("未设置文件路径。");
else if( _sql == "" ) throw new Exception("未设置Excel表格名称。");
else
{
_conn.ConnectionString = _connString;
_conn.Open();
}
}
/// <summary>
/// 获取Excel表格转换后的DataTable对象。
/// </summary>
public DataTable GetTable()
{
_da = new OleDbDataAdapter( _sql, _conn );
_dt = new DataTable( "Excel" );
_da.Fill( _dt );
_conn.Close();
return _dt;
}
/// <summary>
/// 销毁对象。
/// </summary>
public void Dispose()
{
if( _dt != null ) _dt.Dispose();
if( _da != null ) _da.Dispose();
if( _conn != null ) _conn.Dispose();
GC.SuppressFinalize( this );
}
public static DataTable GetExcelSheet(string strPath)
{
OleDbConnection ExcelConnection = new OleDbConnection(@"Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + strPath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'");
OleDbCommand ExcelCommand = new OleDbCommand();
ExcelCommand.Connection = ExcelConnection;
OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand);
ExcelConnection.Open();
DataTable ExcelSheets = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
ExcelConnection.Close();
return ExcelSheets;
}
}
}
在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; ”,这样就可以。
C#读取Excel需要注意的:
IMEX=1:混合模式
HDR=Yes; 是否让第一行作为列头
两者必须一起使用。
看了你说要做成兼容的,个人想法这样子来处理看 成不啊?
先创建一个Excel的实例,然后取这个实例的Version,然后根据不同的Version来配置相应的Extended Properties值以及连接字符串,再来实现相应的读取代码。
最好让客户上传上来的excel都经过转换,最好转换成csv,一般客户拷来拷去,文件容易变的混乱,这种转换一般人都会.完全没有必要去处理多种格式的情况