急~~~在线等 excel导入导出问题(导出有乱码)

发布网友 发布时间:2022-04-24 12:25

我来回答

2个回答

热心网友 时间:2023-10-12 19:16

拷过去直接用. 用导入返回的DATATBLE绑定到DATAGRIDVIEW控件.

/// <summary>
///使用OLEDB方式读写Excel,不需要Office组件支持
/// </summary>
class IOIEExcel
{
/************************************************************************************************************************
*
* /// 本人的Excel导入导出方法有以下特色:
///1、使用OLEDB方式读写Excel,不需要Office组件支持;
///2、支持导入导出时进度条(ProgressBar);
///3、可以将本地DataSet中的数据类型转换为对应的OleDB的数据类型导出,使导出的数据区分开时间、数字、字符串,而不是像上一版中一样全是字符串;
///4、修正了Excel2003中某些工作薄名称为汉字的表无法正确识别的BUG
///5、删除了一个无用的方法GetFirstSheetName,本方法用于获取第一个工作薄的表明,一点用没有。
*
* **********************************************************************************************************************/

/// <summary>
/// 获取链接字符串
/// </summary>
/// <param name="strFilePath"></param>
/// <returns></returns>
public static string GetExcelConnection(string strFilePath)
{
if (!File.Exists(strFilePath))
{
throw new Exception("指定的Excel文件不存在!");
}
return
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + strFilePath + ";" +
@"Extended Properties=" + Convert.ToChar(34).ToString() +
@"Excel 8.0;" + "Imex=2;HDR=Yes;" + Convert.ToChar(34).ToString();
}

/// <summary>
/// 返回指定文件所包含的工作簿列表;如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空
/// </summary>
/// <param name="strFilePath">要获取的Excel</param>
/// <returns>如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空</returns>
public static ArrayList GetExcelWorkSheets(string strFilePath)
{
ArrayList alTables = new ArrayList();

OleDbConnection odn = new OleDbConnection(GetExcelConnection(strFilePath));
odn.Open();

DataTable dt = new DataTable();

dt = odn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (dt == null)
{
throw new Exception("无法获取指定Excel的架构。");
}

foreach (DataRow dr in dt.Rows)
{
string tempName = dr["Table_Name"].ToString();

int iDolarIndex = tempName.IndexOf('$');

if (iDolarIndex > 0)
{
tempName = tempName.Substring(0, iDolarIndex);
}

//修正了Excel2003中某些工作薄名称为汉字的表无法正确识别的BUG。
if (tempName[0] == '\'')
{
if (tempName[tempName.Length - 1] == '\'')
{
tempName = tempName.Substring(1, tempName.Length - 2);
}
else
{
tempName = tempName.Substring(1, tempName.Length - 1);
}

}
if (!alTables.Contains(tempName))
{
alTables.Add(tempName);
}

}
odn.Close();

if (alTables.Count == 0)
{
return null;
}
return alTables;
}

/// <summary>
/// 获取指定路径、指定工作簿名称的Excel数据
/// </summary>
/// <param name="FilePath">文件存储路径</param>
/// <param name="WorkSheetName">工作簿名称</param>
/// <returns>如果争取找到了数据会返回一个完整的Table,否则返回异常</returns>
public static DataTable GetExcelData(string FilePath, string WorkSheetName)
{
DataTable dtExcel = new DataTable();
OleDbConnection con = new OleDbConnection(IOIEExcel.GetExcelConnection(FilePath));
OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from [" + WorkSheetName + "$]", con);

con.Open();
adapter.FillSchema(dtExcel, SchemaType.Mapped);
adapter.Fill(dtExcel);

con.Close();

dtExcel.TableName = WorkSheetName;
return dtExcel;
}

/// <summary>
///
/// </summary>
/// <param name="dt">数据源(数据表)</param>
/// <param name="ExcelFileName">要导出的Excle文件,此文件必须已存在</param>
///// <param name="ModelFile">ModelFile为模板文件,该文件与数据源中的表一致,否则数据会导出失败。
///// ModelFile文件里,需要有一张 与 dt.TableName 一致的表,而且字段也要一致。
///// 注明:如果不用ModelFile的话,可以用一个空白Excel文件,
///// 不过,要去掉下面创建表的注释,让OleDb自己创建一个空白表。</param>
/// <returns></returns>
public static string ExportTable2ExcelFile(DataTable dt, string ExcelFileName, string strWorkSheetName, ref System.Windows.Forms.ProgressBar progressBar)//, string ModelFile)
{
if (File.Exists(ExcelFileName) == false)
{
return "指定文件不存在!";
}

if (dt == null)
{
return "数据不能为空!";
}

if (strWorkSheetName.ToString() == "")
{
return "数据表名不可以为空!";
}
dt.TableName = strWorkSheetName;

int iRows = dt.Rows.Count;
int iCols = dt.Columns.Count;

StringBuilder stringBuilder;
string connString;

if (iRows == 0)
{
return "没有可导入数据!";
}

stringBuilder = new StringBuilder();

connString = IOIEExcel.GetExcelConnection(ExcelFileName);// "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";

//先查看此Excel中是否有相关Table,如果有的话就删除,然后导入新的。
//生成创建表的脚本
stringBuilder.Append("CREATE TABLE ");
stringBuilder.Append(dt.TableName + " ( ");
for (int i = 0; i < iCols; i++)
{
//此处是本版本改进中最实用的地方
string strType = IOIEExcel.GetOleDataType(dt.Columns[i]);
if (i < iCols - 1)
stringBuilder.Append(string.Format("{0} {1},", dt.Columns[i].ColumnName, strType));
else
stringBuilder.Append(string.Format("{0} {1})", dt.Columns[i].ColumnName, strType));
}

using (OleDbConnection objConn = new OleDbConnection(connString))
{
//控制进度条
int iCount = 1, iTotal = dt.Rows.Count + 4;
progressBar.Minimum = Convert.ToInt32(100 / iTotal);
progressBar.Maximum = 100;
progressBar.Step = 1;

OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn;

//插入新表
objCmd.CommandText = stringBuilder.ToString();

try
{
objConn.Open();
//插入新表
objCmd.ExecuteNonQuery();
progressBar.PerformStep();
}
catch (Exception e)
{
return "在Excel中创建表失败!错误信息:" + e.Message;
}

stringBuilder.Remove(0, stringBuilder.Length);

stringBuilder.Append("INSERT INTO ");
stringBuilder.Append(dt.TableName + " ( ");

//先插入标头
for (int i = 0; i < iCols; i++)
{
if (i < iCols - 1)
stringBuilder.Append(dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append(dt.Columns[i].ColumnName + ") values (");
}

for (int i = 0; i < iCols; i++)
{
if (i < iCols - 1)
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ")");
}

progressBar.PerformStep();

//建立插入动作的Command
objCmd.CommandText = stringBuilder.ToString();
OleDbParameterCollection oleParam = objCmd.Parameters;

oleParam.Clear();
for (int i = 0; i < iCols; i++)
{
OleDbType oleDbType = IOIEExcel.GetRefOleDataType(dt.Columns[i]);

//此处是本版本改进中最实用的地方
oleParam.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, oleDbType));
}
progressBar.PerformStep();

//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < oleParam.Count; i++)
{
oleParam[i].Value = row[i];
}

objCmd.ExecuteNonQuery();

progressBar.PerformStep();

}
progressBar.Value = progressBar.Maximum;
return "数据已成功导入Excel!";
}
}

/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType的数据类型字符串
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>
public static string GetOleDataType(DataColumn dataColumn)
{
switch (dataColumn.DataType.Name)
{
case "String"://字符串
{
return "VarChar";
}
case "Double"://数字
{
return "Double";
}
case "Decimal"://数字
{
return "Decimal";
}
case "DateTime"://时间
{
return "Date";
}
default://
{
return "VarChar";
}
}
}

/// <summary>
/// 获取与本地DataSet中指定列的类型对应的OleDbType类型
/// </summary>
/// <param name="dataColumn"></param>
/// <returns></returns>
public static OleDbType GetRefOleDataType(DataColumn dataColumn)
{
switch (dataColumn.DataType.Name)
{
case "String"://字符串
{
return OleDbType.VarChar;
}
case "Double"://数字
{
return OleDbType.Double;
}
case "Decimal"://数字
{
return OleDbType.Decimal;
}
case "DateTime"://时间
{
return OleDbType.Date;
}
default:
{
return OleDbType.VarChar;
}
}
}
}

热心网友 时间:2023-10-12 19:17

我QQ空间里有导出Excel的方法 你可以去试试 qq452337739

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com