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

在用户导入导出excel一直没有正解 考的代码总有问题 在此你不必担心 这能帮你就绝一切

2012-03-21 12:55 435 查看
一、导出标准excel

这个为题不是很好解决 不过通过以下学习 我想你用该没问题了

Asp.Net读取excel文件的时候 出错提示:外部表不是预期的格式

解决方法:

用记事本打开你的excel文件,看看显示是否为乱码。

若是html代码,则表示你的excel文件格式不是标准的excel格式,才会提示“外部表不是预期的格式”的错误;

若是乱码,我这边测试是不会提示这个错误的,可以成功导入。

其实出现这个错误的原因是,你的Excel是从程序中导出的,并且是使用

Response的方式直接把html代码输出到Excel中的

其实是可以解决的,导出的时候使用Excel操作Api来导出就是标准格式

-----------------------------------------------------------------------------------------------------

遇到了这个问题,Response输出的EXCEL文件修改后上传更新时出错,

“外部表不是预期的格式”

解决方式:

1.用EXCEL另存为功能另存成标准格式XLS格式(Response导出的其实是网页文件)

//用一下代码时首先要在指定的路径 下面建一个excel文件当做模板 以下方法是出来一个DataTable调用的"注意创建模板时你是想

输出什么格式就把模板的第一行写上什么字段"

private void DaochuEXCEl(DataTable dt)

{

// 根据模板文件创建副本

string filePath = Server.MapPath("~/excel/Fuben.xls");//在指定的路径下面创建一个excel文件名为Fuben.xls

File.Copy(Server.MapPath("~/excel/demo.xls"), filePath);//把模板里面的数据加载到Fuben.xls里面

// 使用OleDb驱动程序连接到副本

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath +

";Extended Properties=Excel 8.0;");//创建一个连接用oledb连接到filepath这个路径的文件至于括号里面的 写的是某种格式

using (conn)//自动回收机制用完释放

{

conn.Open();//打开连接

foreach (DataRow row in dt.Rows)

{

// 增加记录

OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$]([serial], [quyu], [name],[addr],[faren],[企业负责

人],[质量负责人],[经营方式],[经营范围],[仓库地址],[许可证号],[发证机关],[许可证发证日期],[许可证有效日期],[药品养护人数],[药

品验收人数],[质量管理人数],[药品保管人数],[岗位总人数],[在职情况]) VALUES(@serial,@quyu,@name,@addr,@faren,@企业负责人,@质量

负责人,@经营方式,@经营范围,@仓库地址,@许可证号,@发证机关,@许可证发证日期,@许可证有效日期,@药品养护人数,@药品验收人数,@质量管

理人数,@药品保管人数,@岗位总人数,@在职情况)", conn);//就是创建一个insert添加语句 只不过是想excel里添加数据 说白了就和sql语

句一样只是用oledbcommand类型想excel里加 sheet1$的意思是excel里面的第一张表括号里面是模板里面的字段"注意创建模板时你是想输出什

么格式就把模板的第一行写上什么字段"

cmd.Parameters.AddWithValue("@serial", row["serial"].ToString());//在这就是向excel里面加载填充数据@serial

是和上面的insert语句里面对应的cmd.Parameters.AddWithValue这个方法有两个参数就像是sqlparameter一样 第一个参数是要被赋值的第二

个是 值 这个方法就是 把第二个参数里面的值赋给第一个参数

cmd.Parameters.AddWithValue("@quyu", row["quyu"].ToString());

cmd.Parameters.AddWithValue("@name", row["name"].ToString());

cmd.Parameters.AddWithValue("@addr", row["addr"].ToString());

cmd.Parameters.AddWithValue("@faren", row["faren"].ToString());

cmd.Parameters.AddWithValue("@企业负责人", row["企业负责人"].ToString());

cmd.Parameters.AddWithValue("@质量负责人", row["质量负责人"].ToString());

cmd.Parameters.AddWithValue("@经营方式", row["经营方式"].ToString());

cmd.Parameters.AddWithValue("@经营范围", row["经营范围"].ToString());

cmd.Parameters.AddWithValue("@仓库地址", row["仓库地址"].ToString());

cmd.Parameters.AddWithValue("@许可证号", row["许可证号"].ToString());

cmd.Parameters.AddWithValue("@发证机关", row["发证机关"].ToString());

cmd.Parameters.AddWithValue("@许可证发证日期", row["许可证发证日期"].ToString());

cmd.Parameters.AddWithValue("@许可证有效日期", row["许可证有效日期"].ToString());

cmd.Parameters.AddWithValue("@药品养护人数", row["药品养护人数"].ToString());

cmd.Parameters.AddWithValue("@药品验收人数", row["药品验收人数"].ToString());

cmd.Parameters.AddWithValue("@质量管理人数", row["质量管理人数"].ToString());

cmd.Parameters.AddWithValue("@药品保管人数", row["药品保管人数"].ToString());

cmd.Parameters.AddWithValue("@岗位总人数", row["总人数"].ToString());

cmd.Parameters.AddWithValue("@在职情况", row["在职情况"].ToString());

cmd.ExecuteNonQuery();//最后赋值之后 保存一下本列 继续下次循环

}

}

// 输出副本的二进制字节流

Response.ContentType = "application/ms-excel";//一个格式

Response.AppendHeader("Content-Disposition", "attachment;filename=info.xls");//attachment;filename=info.xls括号里

面的这个方法是用户在下载时默认的一个名字info.xls是默认的一个名字

//如果要是数据量大的话一定要加上GC要不然就会报"正由另一个进程,因此该进程无法访问此文件" 这是因为上面的输出副本进

程为关闭导致的 要是不加上GC那么datatable传来数据量小的话 也不会报错 如果datatable数据量大那就没的说 就是包上面的错

GC.GetTotalMemory(false);

GC.Collect();

GC.WaitForPendingFinalizers();

GC.Collect();

GC.GetTotalMemory(true);

Response.BinaryWrite(File.ReadAllBytes(filePath));//这的意思是让用户下载Fuben.xls这个副本

// 删除副本

File.Delete(filePath);//最后用完删除副本

}

二、导入excel

导入很简单不解释

/// <summary>

/// 读取Excel数据到DataSet

/// </summary>

/// <param name="strFileName">带路径名称</param>

/// <returns></returns>

private static DataSet ReadExcel(string strFileName)

{

string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties=\"Excel

8.0;HDR=Yes;IMEX=1;Persist Security Info=False\"";

strConnection = string.Format(strConnection, strFileName);

OleDbConnection con = new OleDbConnection(strConnection);

con.Open();

try

{

DataTable schema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE"

});

//下面取得第一个表名

string strTableName = schema.Rows[0]["TABLE_NAME"].ToString();

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + strTableName + "]", con);

DataSet ds = new DataSet();

da.Fill(ds);

da.Dispose();

return ds;

}

catch (Exception ex)

{

throw ex;

}

finally

{

con.Close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: