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

一、导出标准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();
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值