ASP.NET NPOI Excel导入、导出,高级、全面、总结版

如果有不懂,欢迎随时提问,在评论处留下你的疑问、建议、意见。本主会及时处理。哈哈哈哈。。。

导语:客户需求中Excel导入、导出处理几乎都是需要的。以下导入、导出的代码处理,是根据不同的用户提出的需求,总结出来的。让我们看看都有哪些:
1、导出后,需要导入(毋容置疑,导入的必须是正式的Excel)
2、导出的Excel,需要各种标题要求,单行合并、多行合并,表格样式、标题字体、字体大小等等。
3、导出的Excel,多种用途,需要用于导入修改数据库数据、用于统计(数值统计表格内容必须是数字格式)
4、复杂表头表Excel导入怎么处理?答:将Excel上传到服务器,打开服务器Excel,删除多余的表头,只留下对应数据库表的那一行。这样就变成单行表头的Excel了。
5、。。。。情况太多,就不一一列举了。

进入正题。。。

正式Excel导出,设置单元格字体、边框、上下左右居中、数值防止科学计数法(先将表头写入一个Excel,设置好表头格式,保存到项目文件夹,作为导出的模(mu)板。用模板可以省去写表头的代码,并且可以防止导入的时候因代码创建的表头出现异常)。导出数据源是DataTable,如果是其它的做下代码调整即可。一起来看代码吧

引用到的命名空间,下载NPOI.dll并引用到项目中
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.SS.Util;

private void ToExcel(DataSet ds)
{
string filePath = “”;
bool check = false;
try
{
if (ds.Tables[0].Rows.Count > 0)
{
DataTable dt = ds.Tables[0];
string filename = “KCPD_” + Session[“UserID”].ToString() + “_” + DateTime.Now.ToString(“yyyyMMddhhmmss”) + “.xls”;
//临时存放路径
filePath = Server.MapPath(“~/upload/” + filename);
//Excel模版
string masterPath = Server.MapPath(“~/upload/Master/KCPD.xls”);
//复制Excel模版
File.Copy(masterPath, filePath);

                #region  将文件的只读勾取消 以免发生不必要的错误
                // 先把文件的属性读取出来 
                FileAttributes attrs = File.GetAttributes(filePath);

                // 下面表达式中的 1 是 FileAttributes.ReadOnly 的值 
                // 此表达式是把 ReadOnly 所在的位改成 0, 
                attrs = (FileAttributes)((int)attrs & ~(1));

                File.SetAttributes(filePath, attrs);
                #endregion

                FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                Workbook hssfworkbook = new HSSFWorkbook(file);
                Sheet sheet = hssfworkbook.GetSheet("Sheet1");

                #region 设置单元格样式
                NPOI.SS.UserModel.Font dataFont = hssfworkbook.CreateFont();
                dataFont.FontHeightInPoints = 9;
                //dataFont.Boldweight = 10;
                dataFont.FontName = "宋体";

                CellStyle celldatastyle = hssfworkbook.CreateCellStyle();
                //celldatastyle.Alignment = HorizontalAlignment.CENTER_SELECTION;
                celldatastyle.VerticalAlignment = VerticalAlignment.CENTER;
                celldatastyle.BorderBottom = CellBorderType.THIN;
                celldatastyle.BorderLeft = CellBorderType.THIN;
                celldatastyle.BorderRight = CellBorderType.THIN;
                celldatastyle.BorderTop = CellBorderType.THIN;
                celldatastyle.WrapText = true;
                celldatastyle.Indention = 0;//缩进
                celldatastyle.SetFont(dataFont);
                #endregion

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //这里需要注意顺序
                    //[配件ID],[识别码],[配件名称],[配件规格],[配件代码],[版本],[上月库存],[采购入库],[良品入库],[维修返回],
                    //[维修入库],[调整库存],[调拨入库],[销售出库],[免费出库],[调拨出库],[维修出库],[其它出库],[现有库存],[盘点库存]

                    Row row = sheet.CreateRow(i + 1);
                    row.CreateCell(0).SetCellValue(Convert.ToInt32(dt.Rows[i]["配件ID"].ToString()));
                    row.CreateCell(1).SetCellValue(dt.Rows[i]["识别码"].ToString());
                    row.CreateCell(2).SetCellValue(dt.Rows[i]["配件名称"].ToString());
                    row.CreateCell(3).SetCellValue(dt.Rows[i]["配件规格"].ToString());
                    row.CreateCell(4).SetCellValue(dt.Rows[i]["配件代码"].ToString());
                    row.CreateCell(5).SetCellValue(dt.Rows[i]["版本"].ToString());
                    row.CreateCell(6).SetCellValue(Convert.ToInt32(dt.Rows[i]["上月库存"].ToString()));
                    row.CreateCell(7).SetCellValue(Convert.ToInt32(dt.Rows[i]["采购入库"].ToString()));
                    row.CreateCell(8).SetCellValue(Convert.ToInt32(dt.Rows[i]["良品入库"].ToString()));
                    row.CreateCell(9).SetCellValue(Convert.ToInt32(dt.Rows[i]["维修返回"].ToString()));

                    row.CreateCell(10).SetCellValue(Convert.ToInt32(dt.Rows[i]["维修入库"].ToString()));
                    row.CreateCell(11).SetCellValue(Convert.ToInt32(dt.Rows[i]["调整库存"].ToString()));
                    row.CreateCell(12).SetCellValue(Convert.ToInt32(dt.Rows[i]["调拨入库"].ToString()));
                    row.CreateCell(13).SetCellValue(Convert.ToInt32(dt.Rows[i]["销售出库"].ToString()));
                    row.CreateCell(14).SetCellValue(Convert.ToInt32(dt.Rows[i]["免费出库"].ToString()));
                    row.CreateCell(15).SetCellValue(Convert.ToInt32(dt.Rows[i]["调拨出库"].ToString()));
                    row.CreateCell(16).SetCellValue(Convert.ToInt32(dt.Rows[i]["维修出库"].ToString()));
                    row.CreateCell(17).SetCellValue(Convert.ToInt32(dt.Rows[i]["其它出库"].ToString()));
                    row.CreateCell(18).SetCellValue(Convert.ToInt32(dt.Rows[i]["现有库存"].ToString()));
                    row.CreateCell(19).SetCellValue(Convert.ToInt32(dt.Rows[i]["盘点库存"].ToString()));

                    #region 设置单元格样式
                    row.GetCell(0).CellStyle = celldatastyle;
                    row.GetCell(1).CellStyle = celldatastyle;
                    row.GetCell(2).CellStyle = celldatastyle;
                    row.GetCell(3).CellStyle = celldatastyle;
                    row.GetCell(4).CellStyle = celldatastyle;
                    row.GetCell(5).CellStyle = celldatastyle;
                    row.GetCell(6).CellStyle = celldatastyle;
                    row.GetCell(7).CellStyle = celldatastyle;
                    row.GetCell(8).CellStyle = celldatastyle;
                    row.GetCell(9).CellStyle = celldatastyle;

                    row.GetCell(10).CellStyle = celldatastyle;
                    row.GetCell(11).CellStyle = celldatastyle;
                    row.GetCell(12).CellStyle = celldatastyle;
                    row.GetCell(13).CellStyle = celldatastyle;
                    row.GetCell(14).CellStyle = celldatastyle;
                    row.GetCell(15).CellStyle = celldatastyle;
                    row.GetCell(16).CellStyle = celldatastyle;
                    row.GetCell(17).CellStyle = celldatastyle;
                    row.GetCell(18).CellStyle = celldatastyle;
                    row.GetCell(19).CellStyle = celldatastyle;
                    #endregion
                }

                using (FileStream filess = File.OpenWrite(filePath))
                {
                    hssfworkbook.Write(filess);//讲Sheet1写入Excel
                }

                check = true;
                file.Close();//关闭FileStream对象

                // 输出副本的二进制字节流
                HttpContext.Current.Response.Charset = "UTF-8"; // 或UTF-7 以防乱码
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                Response.ContentType = "application/ms-excel";
                Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(filename)));
                Response.BinaryWrite(File.ReadAllBytes(filePath));
            }

        }
        catch (Exception ex)
        {
            excel_msg.Text = "导入返回信息:导出失败!错误信息:" + ex.Message;
            this.excel_msg.ForeColor = System.Drawing.Color.Red;
        }
        finally
        {
            if (check)
            {
                //删除副本
                File.Delete(filePath);
            }
        }
    }

正式Excel导入,导入的数据千奇百怪,最重要的是复杂表头的导入。遇到复杂表头的时候,可以用代码先把多余的表头行删除,只留下对应数据库表的那一行即可。代码适用于大量数据的导入,而且处理速度杠杠的,对导入数据进行全面扫描,扫描出所有不符合指定格式的数据,并指出出现问题的行和列,以Excel方式将错误返回前端,提供用户下载

处理步骤:导入Excel——复制副本——删除多余表头——创建临时表——调用批量导入控件将数据复制到临时表——调用存储过程扫描错误并处理——将处理结果插入到Excel并返回到客户端提供客户下载

引用到的命名空间,下载NPOI.dll并引用到项目中
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.SS.Util;
using System.Configuration;
using System.Data.OleDb;
using System.Data.SqlClient;

—————————————————-

—-判断是否是整数,如果不是整数,返回String。
—-User:Lzw

—-Time:2015-04-05 11:09


CREATE FUNCTION [dbo].[IsNumber](@StrVal nvarchar(max))
RETURNS nvarchar(10)
AS
BEGIN

DECLARE @Flag nvarchar(10) 

if IsNumeric(@StrVal)=1
begin
    SET @Flag='Number'
end
else
begin
    SET @Flag='String'
end

RETURN @Flag

END

用于扫描Excel的存储过程
– exec SP_Check_Import_T_Fittings_Collect_tmp ‘KCPD_c0f5459f_0c87_4144_b222_0624c3c0414a’,1000,1,’2015-03-01’,false
/*
User:Lzw
Date:2015年4月4日 10:08:29
Name:盘点数据导入处理(扫描数据,返回异常详细信息)
*/
CREATE PROC [dbo].[SP_Check_Import_T_Fittings_Collect_tmp]
@Nname nvarchar(100), –创建的临时表名称
@UserID varchar(100),
@DepotID varchar(100),
@CollectTime varchar(100),
@IsImport bit
as

/*要点说明:
([ID]+1)[Row] –行数,注意:(ID + Excel中表头占据的行数)=行号
全面扫描数据,返回异常信息]存储过程

Tips:Excel数据中只要存在异常,则导入失败,将异常详细信息返回客户端
*/

DECLARE @SQL nvarchar(max),@SQL1 nvarchar(max),@SQL2 nvarchar(max),@SQL3 nvarchar(max)

SET @SQL=’
SELECT f_id,COUNT()Num INTO #Repeat FROM [‘+@Nname+’] GROUP BY f_id HAVING COUNT()>1
DECLARE @RepeatNum INT
SELECT @RepeatNum=COUNT(*) FROM #Repeat

SELECT f_id,[盘点库存] into #topKC FROM [T_Fittings_Collect] WHERE DepotId=’+@DepotID+’ AND CollectTime =DateAdd(m,-1,”’+@CollectTime+”’)

–现有库存!=盘点库存总数
DECLARE @Num INT
SELECT ([ID]+1) Row into #now_old FROM [‘+@Nname+’] where [现有库存]<>[盘点库存]
SELECT @Num=COUNT(*) FROM [‘+@Nname+’] where [现有库存]<>[盘点库存]

–检测数据是否存在异常
select ([ID]+1)[Row] –对应Excel Sheet1表中的行号
,[f_id]
,[sn]
,[FittingName]
,[SpecName]
,[FittingId]
,[FittingVersion]
,[LastAmount]
,[采购入库]
,[良品入库]
,[维修返回]
,[维修入库]
,[调整库存]
,[调拨入库]
,[销售发货]
,[免费发货]
,[办事处发货]
,[维修]
,[其它]
,[现有库存]
,[盘点库存]
,”’+@CollectTime+”’ as [CollectTime]
,’+@DepotID+’ as [DepotId]
,’+@UserID+’ as [UserId]
,(case when [f_id] is null or [f_id] =”” or [dbo].IsNumber=”String” then ”配件ID[ ”+isnull([f_id],”NULL”)+” ]无效! ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 上月库存 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 采购入库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 良品入库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 维修返回 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 维修入库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 调整库存 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 调拨入库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 销售出库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 免费出库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 调拨出库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 维修出库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 其它出库 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 现有库存 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end)+
(case when [dbo].IsNumber=”String” then ”[ 盘点库存 ]列格式不正确!请检查是否包含不合法字符 ; ” else ”” end) Error
into #Base
from [‘+@Nname+’]
order by [ID] desc


SET @SQL1=’

–检测数据是否已存在
SELECT DISTINCT b.[f_id] IsExist,a.* into #Data from #Base a
left join
T_Fittings_Collect_tmp b on a.CollectTime=b.CollectTime and a.[DepotId] =b.[DepotId] and a.[f_id]=b.[f_id]

–统计( 上月[盘点库存] != 本月[期初库存] )记录
DECLARE @noTop INT

SELECT
a.[Row],a.f_id,[LastAmount],isnull(b.[盘点库存],0)[盘点库存] –上月[盘点库存] 和 本月[期初库存]
into #noTop
FROM #Base a
LEFT JOIN

topKC b ON a.f_id=b.f_id

SELECT @noTop=COUNT(*) FROM #noTop where [LastAmount]<>[盘点库存]

–异常总计
declare @Error_Rowber int
select @Error_Rowber=count(*) from #Base where Error<>””

–影响行数
declare @InsertRow int –插入总记录数
set @InsertRow=0
declare @UpdateRow int –修改总记录数
set @UpdateRow=0

–数据不存在异常
if @Error_Rowber=0 AND @noTop=0 AND (@Num=0 OR ‘+convert(varchar(10),@IsImport)+’=1)
begin

--Insert部分
INSERT INTO [dbo].[T_Fittings_Collect_tmp](
   [f_id],[sn],[FittingName],[SpecName],[FittingId],[FittingVersion]
  ,[LastAmount],[采购入库],[良品入库],[维修返回],[维修入库]
  ,[调整库存],[调拨入库],[销售发货],[免费发货],[办事处发货]
  ,[维修],[其它],[现有库存],[盘点库存]
  ,[CollectTime],[DepotId],[UserId]
)
select 
   [f_id],[sn],[FittingName],[SpecName],[FittingId],[FittingVersion]
  ,[LastAmount],[采购入库],[良品入库],[维修返回],[维修入库]
  ,[调整库存],[调拨入库],[销售发货],[免费发货],[办事处发货]
  ,[维修],[其它],[现有库存],[盘点库存]
  ,[CollectTime],[DepotId],[UserId]
from #Data where IsExist is null
set @InsertRow=@@ROWCOUNT


SET @SQL2=’
–Update部分
update [T_Fittings_Collect_tmp]
set [LastAmount]=convert([decimal](10, 0),b.[LastAmount]),
[采购入库]=convert([decimal](10, 0),b.[采购入库]),
[良品入库]=convert([decimal](10, 0),b.[良品入库]),
[维修返回]=convert([decimal](10, 0),b.[维修返回]),
[维修入库]=convert([decimal](10, 0),b.[维修入库]),
[调整库存]=convert([decimal](10, 0),b.[调整库存]),
[调拨入库]=convert([decimal](10, 0),b.[调拨入库]),
[销售发货]=convert([decimal](10, 0),b.[销售发货]),
[免费发货]=convert([decimal](10, 0),b.[免费发货]),
[办事处发货]=convert([decimal](10, 0),b.[办事处发货]),
[维修]=convert([decimal](10, 0),b.[维修]),
[其它]=convert([decimal](10, 0),b.[其它]),
[现有库存]=convert([decimal](10, 0),b.[现有库存]),
[盘点库存]=convert([decimal](10, 0),b.[盘点库存]),
UserID=’+@UserID+’
from [T_Fittings_Collect_tmp] a,#Data b
where a.CollectTime=b.CollectTime
and a.[DepotId] =b.[DepotId]
and a.[f_id]=b.[f_id]
and b.IsExist is not null
set @UpdateRow=@@ROWCOUNT

SELECT @InsertRow as InsertRow,@UpdateRow as UpdateRow

--删除审核信息
delete T_Fittings_Collect_date where depotid='+@DepotID+' and datediff(m,CollectDate,'''+@CollectTime+''')=0
--重新添加审核信息
insert into T_Fittings_Collect_date(depotid,collectdate,CreateUserid) values('+@DepotID+','''+@CollectTime+''','+@UserID+')

end
–数据存在异常,把异常详细信息反馈到客户端
else
begin

SELECT @InsertRow as InsertRow,@UpdateRow as UpdateRow
IF @noTop<>0
BEGIN
    SELECT identity(int,1,1)序号,* into #error_top FROM (
    SELECT (''第[ ''+convert(nvarchar(100),([Row]))+'' ]行'')Excel行号,(Error)异常详细信息 from #Data where Error<>''''
    UNION ALL
    SELECT ''第[ ''+convert(nvarchar(100),([Row]))+'' ]行'',''上月[盘点库存(''+convert(nvarchar(100),[LastAmount])+'')]、本月[期初库存(''+convert(nvarchar(100),[盘点库存])+'')]不一致,无法导入。'' FROM #noTop where [LastAmount]<>[盘点库存]
    )DATA

    select * from #error_top
    drop table #error_top
END


SET @SQL3=’
ELSE IF (@Num>0 and ‘+convert(varchar(10),@IsImport)+’=0)
BEGIN
SELECT identity(int,1,1)序号,* into #error FROM (
SELECT (”第[ ”+convert(nvarchar(100),([Row]))+” ]行”)Excel行号,(Error)异常详细信息 from #Data where Error<>””
UNION ALL
SELECT ”第[ ”+convert(nvarchar(100),([Row]))+” ]行”,”[ 现有库存 ]、[ 盘点库存 ]不一致,需要拥有[导入特殊权限]方可导入。” FROM #now_old
)DATA

    select * from #error
    drop table #error
END
ELSE IF @RepeatNum=0
BEGIN
    SELECT ROW_NUMBER() OVER(ORDER BY [Row] asc)序号,(''第[ ''+convert(nvarchar(100),([Row]))+'' ]行'')Excel行号,(Error)异常详细信息 from #Data where Error<>''''
END
ELSE
BEGIN

    SELECT ROW_NUMBER() OVER(ORDER BY [Row] asc)序号,(''第[ ''+convert(nvarchar(100),([Row]))+'' ]行'')Excel行号,(Error)异常详细信息 from #Data where Error<>''''
    UNION ALL
    SELECT 100000,''第[ n ]行'',''[ 配件ID ]列存在重复数据:''+[f_id]+'' , 重复次数:''+convert(nvarchar(100),Num) FROM #Repeat
END

end

drop table #Base,#Data,#Repeat,#topKC,#noTop,#now_old

PRINT @SQL
PRINT @SQL1
PRINT @SQL2
PRINT @SQL3
EXEC(@SQL+@SQL1+@SQL2+@SQL3)

region 导入Excel

    /// <summary>
    /// 立即导入Excel
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnUp_Click(object sender, System.EventArgs e)
    {
        if (this.drop_DepotId_In.SelectedItem.Value == "-1")
        { excel_msg.Text = "导入返回信息:仓库不能为空!"; this.Linkbtn.Visible = false; this.excel_msg.ForeColor = System.Drawing.Color.Red; return; }

        if (this.fileExcel.PostedFile.FileName.Length == 0)
        { excel_msg.Text = "导入返回信息:没有选择文件!"; this.Linkbtn.Visible = false; this.excel_msg.ForeColor = System.Drawing.Color.Red; return; }

        string ext = this.fileExcel.PostedFile.FileName.Substring(fileExcel.PostedFile.FileName.LastIndexOf('.') + 1).ToLower();
        if (ext != "xls")
        { excel_msg.Text = "导入返回信息:只能导入xls格式的Excel文件!"; this.Linkbtn.Visible = false; this.excel_msg.ForeColor = System.Drawing.Color.Red; return; }

        //记录导入耗时
        DateTime time = DateTime.Now;
        US.Components.UploadFileHelper upfile = new US.Components.UploadFileHelper();
        upfile.UserId = Session["UserID"].ToString();
        upfile.Upload_Type = 0;

        upfile.Save(this.fileExcel.PostedFile);

        //临时表名
        string Nname = ("KCPD_" + Guid.NewGuid().ToString()).Replace("-", "_");

        //创建唯一的临时表
        string CreateSql = string.Format(@"
                CREATE TABLE [dbo].[{0}]
                (
                    [ID] [int] IDENTITY(1,1) NOT NULL,
                    [f_id] [varchar](200),
                    [sn] [varchar](200),
                    [FittingName] [varchar](200),
                    [SpecName] [varchar](200),
                    [FittingId] [varchar](100),
                    [FittingVersion] [varchar](50),
                    [LastAmount] [varchar](200),
                    [采购入库] [varchar](200),
                    [良品入库] [varchar](200),
                    [维修返回] [varchar](200),
                    [维修入库] [varchar](200),
                    [调整库存] [varchar](200),
                    [调拨入库] [varchar](200),
                    [销售发货] [varchar](200),
                    [免费发货] [varchar](200),
                    [办事处发货] [varchar](200),
                    [维修] [varchar](200),
                    [其它] [varchar](200),
                    [现有库存] [varchar](200),
                    [盘点库存] [varchar](200),
                    [CollectTime] [datetime] ,
                    [DepotId] [int],
                    [UserId] [int]
                )", Nname);

        run.ExecSQL(CreateSql);

        try
        {
            string connectionString = ConfigurationSettings.AppSettings["ConnectionString"].Replace("True", "False");
            string constr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + upfile.FilePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";

            string sqlstr = "select * from [Sheet1$]";

            #region OleDb导入
            using (OleDbConnection sourceConnection = new OleDbConnection(constr))
            {
                sourceConnection.Open();

                OleDbCommand ocomm = new OleDbCommand(sqlstr, sourceConnection);
                OleDbDataReader reader = ocomm.ExecuteReader();

                using (SqlConnection destinationConnection = new SqlConnection(connectionString))
                {
                    destinationConnection.Open();

                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
                    {
                        bulkCopy.BatchSize = 1000;//每次传输的行数
                        bulkCopy.BulkCopyTimeout = 3600;

                        //f_id,sn,FittingName,SpecName,FittingId,FittingVersion,LastAmount,采购入库,良品入库,维修返回,
                        //维修入库,调整库存,调拨入库,销售发货,免费发货,办事处发货,维修,其它,现有库存,盘点库存,
                        //CollectTime,DepotId,UserId
                        //第一个参数为Excel中的字段   
                        //第二个参数为数据库表中的字段

                        bulkCopy.ColumnMappings.Add("配件ID", "f_id");
                        bulkCopy.ColumnMappings.Add("识别码", "sn");
                        bulkCopy.ColumnMappings.Add("配件名称", "FittingName");
                        bulkCopy.ColumnMappings.Add("配件规格", "SpecName");
                        bulkCopy.ColumnMappings.Add("配件代码", "FittingId");

                        bulkCopy.ColumnMappings.Add("版本", "FittingVersion");
                        bulkCopy.ColumnMappings.Add("上月库存", "LastAmount");
                        bulkCopy.ColumnMappings.Add("采购入库", "采购入库");
                        bulkCopy.ColumnMappings.Add("良品入库", "良品入库");
                        bulkCopy.ColumnMappings.Add("维修返回", "维修返回");

                        bulkCopy.ColumnMappings.Add("维修入库", "维修入库");
                        bulkCopy.ColumnMappings.Add("调整库存", "调整库存");
                        bulkCopy.ColumnMappings.Add("调拨入库", "调拨入库");
                        bulkCopy.ColumnMappings.Add("销售出库", "销售发货");
                        bulkCopy.ColumnMappings.Add("免费出库", "免费发货");

                        bulkCopy.ColumnMappings.Add("调拨出库", "办事处发货");
                        bulkCopy.ColumnMappings.Add("维修出库", "维修");
                        bulkCopy.ColumnMappings.Add("其它出库", "其它");
                        bulkCopy.ColumnMappings.Add("现有库存", "现有库存");
                        bulkCopy.ColumnMappings.Add("盘点库存", "盘点库存");

                        //tbl_cell_gh_temp为目标表   
                        bulkCopy.DestinationTableName = Nname;

                        //将数据复制到数据库
                        bulkCopy.WriteToServer(reader);

                        //关闭reader
                        reader.Close();

                        /*对导入的数据,进行全面扫描。
                        如果有异常则导入失败,将异常信息以Excel的方式返回客户端,提供下载
                        (返回的InsertRow=0,UpdateRow=0则为异常)*/
                        //获取影响行数
                        DataSet ds = run.GetDataSet(
                            string.Format(@"
                                exec SP_Check_Import_T_Fittings_Collect_tmp '{0}',{1},{2},'{3}',{4}", Nname, Session["UserID"].ToString(), drop_DepotId_In.SelectedValue, this.txt_inTime.Text + "-01", this.txtIsImport.Value)
                        );//@Nname、@UserID、@DepotID、@CollectTime、@IsImport

                        //Insert总数
                        string InsertRow = ds.Tables[0].Rows[0]["InsertRow"].ToString();
                        string UpdateRow = ds.Tables[0].Rows[0]["UpdateRow"].ToString();

                        //无异常,导入成功提示
                        if (InsertRow != "0" || UpdateRow != "0")
                        {
                            //隐藏下载Excel按钮
                            Linkbtn.Visible = false;

                            //Tips
                            excel_msg.Text = "<br/><br/>导入成功,总耗时:" + (DateTime.Now - time).ToString() + "<br/><br/>共插入数据:" + InsertRow + "条,修改数据:" + UpdateRow + "条";
                            excel_msg.ForeColor = System.Drawing.Color.Blue;
                        }
                        else
                        {
                            //Tips
                            excel_msg.Text = "<br/><br/>导入失败,数据存在异常,查看异常详细信息,请下载:";
                            excel_msg.ForeColor = System.Drawing.Color.Blue;

                            //将异常数据缓存起来
                            Cache.Insert("Error", ds);
                            //显示下载Excel按钮
                            Linkbtn.Visible = true;
                        }

                    }
                }
            }
            #endregion

        }
        catch (Exception ex)
        {
            excel_msg.Text = "导入返回信息:导入失败!错误信息:" + ex.Message;
            this.excel_msg.ForeColor = System.Drawing.Color.Red;
        }
        finally
        {
            if (upfile.FilePath != null)
            {
                delfile(upfile.FilePath);//删除已上传文件
            }
            //删除临时表
            string sql = "drop table  [dbo].[" + Nname + "]";
            run.ExecSQL(sql);
        }

    }

    /// <summary>
    /// 删除上传的临时文件
    /// </summary>
    /// <param name="filestr"></param>
    private void delfile(string filestr)
    {
        FileInfo fi = new FileInfo(filestr);

        if (fi.Exists)
        {
            fi.Delete();
        }
    }

    /// <summary>
    /// 下载异常信息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Linkbtn_Click(object sender, EventArgs e)
    {
        if (Cache["Error"] != null)
        {
            DataSet ds = (DataSet)Cache["Error"];

            //数据存在异常,将异常详细信息导入Excel放到输出流,提供用户下载浏览
            CreateExcel(ds, "1", "系统扫描结果.xls");
        }
        else
        {
            excel_msg.Text = "无异常信息!";
            this.excel_msg.ForeColor = System.Drawing.Color.Red;
            //隐藏下载Excel按钮
            Linkbtn.Visible = false;
        }
    }

    /// <summary>
    /// 将DataSet中的数据导出到Excel
    /// </summary>
    /// <param name="ds"></param>
    /// <param name="typeid"></param>
    /// <param name="FileName"></param>
    public void CreateExcel(DataSet ds, string typeid, string FileName)
    {
        HttpResponse resp;
        resp = Page.Response;
        resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
        resp.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ";");
        //resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
        string colHeaders = "", ls_item = "";
        int i = 0;

        //定义表对象和行对像,同时用DataSet对其值进行初始化 
        DataTable dt = ds.Tables[1];
        DataRow[] myRow = dt.Select("");
        // typeid=="1"时导出为EXCEL格式文档;typeid=="2"时导出为XML格式文档 
        if (typeid == "1")
        {
            //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符 
            for (i = 0; i < dt.Columns.Count; i++)
            {
                if (i == dt.Columns.Count - 1)
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\n";
                }
                else
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\t";
                }
            }
            //向HTTP输出流中写入取得的数据信息 
            resp.Write(colHeaders);
            //逐行处理数据 
            foreach (DataRow row in myRow)
            {
                //在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n 
                for (i = 0; i < dt.Columns.Count; i++)
                {

                    if (i == dt.Columns.Count - 1)
                    {
                        ls_item += row[i].ToString() + "\n";
                    }
                    else
                    {
                        ls_item += row[i].ToString() + "\t";
                    }
                }
                //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据 
                resp.Write(ls_item);
                ls_item = "";
            }
        }
        else
        {
            if (typeid == "2")
            {
                //从DataSet中直接导出XML数据并且写到HTTP输出流中 
                resp.Write(ds.GetXml());
            }
        }
        //写缓冲区中的数据到HTTP头文档中
        resp.End();
    }
    #endregion
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值