C# Excel处理工具

需求:选择一个Excel文件,然后对该Excel文件进行处理,再导出一个处理后的Excel文件。

效果图

这里对Excel的操作使用了NPOI.dll组件,可自行去网上现在或者使用NuGet下载。

界面皮肤

IrisSkin4.dll包括(73皮肤+vs2012兼容) 绿色版下载地址:http://pan.baidu.com/s/1o6dwYvHKd

这里使用到了IrisSkin4.dll皮肤控件

使用方法:

1、添加IrisSkin4.dll引用

1、工具箱,添加此程序集

2、复制皮肤文件

设置皮肤文件的属性

3、代码调用

        public frmMain()
        {
            InitializeComponent();
            //加载皮肤
            skinEngine1.SkinFile ="Skins/Warm.ssk";
            skinEngine1.Active = true;
            skinEngine1.SkinDialogs = false;
            lblShow.Tag = skinEngine1.DisableTag; //如果要让某个控件不使用皮肤,则设置此属性,这样,就可以单独为此控件设置属性了,否则为此控件设置的属性将会被皮肤属性覆盖
            lblMsg.Tag = skinEngine1.DisableTag;
            this.lblShow.ForeColor = Color.Red;
            this.lblMsg.ForeColor = Color.Green;
        }

关于excel的操作,这里还是使用NPOI.dl,可以自己从网上下载,也可以直接从vs的NuGet中下载。

需要注意的是,对于一些比较耗时的界面操作,建议使用一个进度条,然后以异步调用的形式进行操作。异步调用可以开启一个线程,如果在线程调用的代码中需要修改窗体控件,也就是要修改主线程的内容,可以使用如下代码:

Invoke(new MethodInvoker(delegate { progressBar.Maximum = sheet.LastRowNum; }));}

代码很简单,这里我不做过多的说明,详情请参见代码。

using Dapper;
using NExtensions;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.ComponentModel;
using System.Configuration;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;

namespace uuch.CustomsCheckPrint
{
    //modify by:Zouqj  2015/4/9
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            //加载皮肤
            skinEngine1.SkinFile ="Skins/"+ConfigurationManager.AppSettings["themeName"];
            skinEngine1.Active = true;
            skinEngine1.SkinDialogs = false;
            lblShow.Tag = skinEngine1.DisableTag;
            lblMsg.Tag = skinEngine1.DisableTag;
            this.lblShow.ForeColor = Color.Red;
            this.lblMsg.ForeColor = Color.Green;
        }

        public bool IsCalculating { get; set; }

        public void EditAndSave(string filePath, ProgressBar progressBar, Label label)
        {
            // 0       ,    1 ,     2 , 3,    4,    5,   6
            // 收寄日期, 邮件号, 寄达地, 类, 重量, 邮费, 省份
            //序号    提单号    快件单号    发件人    收件人    收件人地址    内件名称    数量    价值(USD)    重量(KG)    省份    首重费用    续重费用    OVS运费    操作费    OVS税费
            var sc = new SqlConnection(ConfigurationManager.AppSettings["connectionString"]);
            sc.Open();
            IWorkbook workbook = null;
            var fileExten = Path.GetExtension(filePath);
            var fsRead = File.OpenRead(filePath);
            if (fileExten == ".xls"||fileExten == ".xlsx")
            {
                workbook = new HSSFWorkbook(fsRead);
            }
            else
            {
                MessageBox.Show("文件不是有效的Excel文件!");
                return;
            }
            string proviceNameA = ConfigurationManager.AppSettings["proviceNameA"];
            var economicProvince = string.IsNullOrEmpty(proviceNameA) ? null : proviceNameA.Split(‘,‘);

            string channelE = string.Empty; //经济渠道
            string channelS = string.Empty; //标准渠道
            if (rbtnA.Checked)
            {
                channelE = ConfigurationManager.AppSettings["channelAE"];
                channelS = ConfigurationManager.AppSettings["channelAS"];
            }
            else if (rbtnB.Checked)
            {
                channelE = ConfigurationManager.AppSettings["channelBE"];
                channelS = ConfigurationManager.AppSettings["channelBS"];
            }

            string pWeighFee = string.Empty; //首重费
            string yWeighFee = string.Empty; //续重费用
            string orderFee = string.Empty; //订单费 操作费

            fsRead.Close();
            //ISheet sheet = workbook.GetSheetAt(0);
            var lackProvinceCount = 1;
            var sheetCount = workbook.NumberOfSheets;
            for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
            {
                var sheetIndexShow = sheetIndex + 1;
                var sheet = workbook.GetSheetAt(sheetIndex);
                //progressBar.Maximum = sheet.LastRowNum;
                if (sheetIndex == 0)
                {
                    Invoke(new MethodInvoker(delegate { progressBar.Maximum = sheet.LastRowNum; }));
                }
                IsCalculating = true;
                for (int i = 1; i <= sheet.LastRowNum; i++)
                {
                    var row = sheet.GetRow(i);

                    var weight = row.GetCell(9) == null ? 0D : row.GetCell(9).NumericCellValue; //重量
                    var targetProvince = row.GetCell(10) == null ? "" : row.GetCell(10).NumericCellValue.ToString().Trim(); //省份
                    if (targetProvince.IsNullOrEmpty())
                    {
                        Invoke(new MethodInvoker(delegate { lblShow.Text += String.Format("{0}  邮件号: {1} 缺少目标地省份!\r\n", lackProvinceCount.ToString("00000"), row.GetCell(1).StringCellValue); }));

                        lackProvinceCount++;
                        continue;
                    }

                    var channelCode = economicProvince.Contains(targetProvince) == true ? channelE : channelS; //根据省份获取渠道代码

                    var sSelectProvince = String.Format("SELECT Base_PlaceID FROM Base_Place WHERE CnName LIKE ‘%{0}%‘ ", targetProvince);
                    var countryID = sc.Query(sSelectProvince, null).FirstOrDefault()["Base_PlaceID"].ToString();

                    var sSelectChannel = String.Format("SELECT Base_ChannelInfoID FROM Base_ChannelInfo WHERE ChannelCode = ‘{0}‘ ", channelCode);
                    var channelID = sc.Query(sSelectChannel, null).FirstOrDefault()["Base_ChannelInfoID"].ToString();

                    string sql = string.Format(@"select SalesPrice, CalStyle  from v_Price_PriceInfo where SubChannelCode=‘{0}‘ and charindex (‘{1}‘,AreaCountry)>0", channelCode, countryID);
                    // 销售价 计算方式 P:首重 Y:续重
                    var result = sc.Query(sql, null).ToList();
                    if (result != null && result.Count() > 0)
                    {
                        foreach (var v in result)
                        {
                            if (v["CalStyle"].ToString() == "Y")
                            {
                                yWeighFee = v["SalesPrice"].ToString();
                            }
                            else if (v["CalStyle"].ToString() == "P")
                            {
                                pWeighFee = result[0]["SalesPrice"].ToString();
                            }
                        }
                    }

                    // 执行运费计算 " EXEC p_CalculatePriceByCH CountryID, Weight, ChannelID, CalFlag ";
                    var sExecProc = String.Format(" EXEC p_CalculatePriceByCH {0}, {1}, {2}, {3} ", countryID, weight, channelID, 1);
                    var query = sc.Query(sExecProc, null).FirstOrDefault();
                    var shipFeeRs = query["BaseFee"].ToString();
                    orderFee = query["OrderFee"].ToString();
                    //Trace.WriteLine(String.Format("{0} - {1}, {2} - {3}, {4} ", targetProvince, countryID, channelCode, channelID, sExecProc));

                    //首重费用 11
                    var cellpWeighFee = row.GetCell(11);
                    cellpWeighFee.SetCellType(CellType.Numeric);
                    cellpWeighFee.SetCellValue(pWeighFee.ToDouble());
                    //续重费用 12
                    var cellyWeighFee = row.GetCell(12);
                    cellyWeighFee.SetCellType(CellType.Numeric);
                    cellyWeighFee.SetCellValue(yWeighFee.ToDouble());
                    //OVS运费 13
                    var cellShipFee = row.GetCell(13);
                    cellShipFee.SetCellType(CellType.Numeric);
                    cellShipFee.SetCellValue(shipFeeRs.ToDouble());
                    //操作费 14
                    var cellOrderFee = row.GetCell(14);
                    cellOrderFee.SetCellType(CellType.Numeric);
                    cellOrderFee.SetCellValue(orderFee.ToDouble());

                    //progressBar.Value = i;
                    Invoke(new MethodInvoker(delegate { lblMsg.Text = String.Format("工作表: {0}/{1} | 行: {2}/{3}", sheetIndexShow, sheetCount, i, sheet.LastRowNum); progressBar1.Value = i; }));  //异步显示进度条
                    System.Windows.Forms.Application.DoEvents();
                }
                Invoke(new MethodInvoker(delegate {  lblShow.Text = "计算成功!";}));
            }

            var fsSave = File.Create(textBoxOutputPath.Text);
            workbook.Write(fsSave);
            fsSave.Close();

            sc.Close();
            IsCalculating = false;
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            if (IsCalculating)
            {
                var rs = MessageBox.Show("计算还没结束, 确定退出?", "确定退出?", MessageBoxButtons.YesNoCancel);
                if (rs == DialogResult.Yes)
                {
                    this.Dispose();
                    this.Close();

                    Environment.Exit(0);
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBoxInputFilePath.Text))
            {
                lblShow.Text = "请先选择要计算的文件!\r\n";
                return;
            }
            if (string.IsNullOrEmpty(textBoxOutputPath.Text))
            {
                lblShow.Text = "必须制定输出文件路径和名称!\r\n";
                return;
            }
            lblShow.Text = "";
            //两种结算方式
            try
            {
                Thread t = new Thread(new ThreadStart(Single));
                t.IsBackground = true;
                t.Start();
            }
            catch (Exception ex)
            {
                LogAPI.WriteLog(ex.Message);
                lblShow.Text=ex.Message;//"计算错误,详情请查看日志!"
                return;
            }
            Trace.WriteLine("OK");
        }
        //适配器
        void Single()
        {
            EditAndSave(textBoxInputFilePath.Text, progressBar1, lblMsg);
        }

        private void buttonChooseInputFile_Click(object sender, EventArgs e)
        {
            var fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = true;
            fileDialog.Title = "选择文件";
            fileDialog.Filter = "Excel files|*.xls; *.xlsx";
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                textBoxInputFilePath.Text = fileDialog.FileName;
            }
        }

        private void buttonChooseOutputFolder_Click(object sender, EventArgs e)
        {
            var saveFileDialog = new SaveFileDialog();
            saveFileDialog.Title = "保存文件";
            saveFileDialog.Filter = "Excel files|*.xls; *.xlsx";
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                textBoxOutputPath.Text = saveFileDialog.FileName;
            }
        }
    }
}

时间: 2024-10-29 19:08:03

C# Excel处理工具的相关文章

下载数据到Excel,工具类

使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method;import java.math.BigDecimal;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.Map; import org.apache.poi.hssf.usermodel.HSSF

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

在Access和MSSqlserver里都有将表直接导出到Excel的工具

在Access和MSSqlserver里都有将表直接导出到Excel的工具,可是当客户需要在程序里将数据库里的表生成Excel表格时,我们用一般的T-sql语句很难做到!下面是我结合网上资料和客户的需求写的代码,仅供学习交流. <%set rs=server.CreateObject("adodb.recordset")sql="select * from Stu_signUp order by id asc"rs.open sql,conn,1,1 Set

如何安装类Excel开发工具的服务器软件?

本文主要介绍如何安装类Excel开发工具-活字格的服务器软件. 1. 活字格安装包介绍首先,在活字格的官方网站中的右上角点击立即试用,然后输入你的邮箱,登录邮箱,点击下载链接就可以下载活字格的安装包HuoZiGe.zip.解压这个安装包,里面会有两个应用程序HuoZiGe_Designer.exe和HuoZiGe_Server.exe. HuoZiGe_Designer.exe指的是活字格设计器,用来设计您的应用程序. HuoZiGe_Server.exe指的是活字格服务器,用来布署发布您的应用

安装类Excel开发工具设计器

本文主要介绍如何安装类Excel开发工具-活字格的设计器. 1. 活字格安装包介绍首先,在活字格的官方网站中的右上角点击立即试用,然后输入你的邮箱,登录邮箱,点击下载链接就可以下载活字格的安装包HuoZiGe.zip.解压这个安装包,里面会有两个应用程序HuoZiGe_Designer.exe和HuoZiGe_Server.exe. HuoZiGe_Designer.exe指的是活字格设计器,用来设计您的应用程序. HuoZiGe_Server.exe指的是活字格服务器,用来布署发布您的应用程序

excel读取 工具类

JAVA源码如下: 1 package cn.yongche.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.util.ArrayList; 8 import java.util.List; 9 import org.apache.poi.hssf.usermodel

java生成excel文件工具类实例

import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; import org.

Excel导入工具类兼容xls和xlsx

package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.us

利用poi3.9做的excel导出工具

一.先看看所生成的文件效果图 二.准备 本文需要六个jar包: dom4j-1.6.1.jar ojdbc14.jar poi-3.9-20121203.jar poi-ooxml-3.9-20121203.jar poi-ooxml-schemas-3.9-20121203.jar xmlbeans-2.3.0.jar 除了ojdbc14.jar是用来访问数据库的,其它的都是导出excel所需要的poi相关jar包. 注:本文是以poi3.9版本写的,利用了SXSSFWorkbook这个Wor

java web 导出Excel 的工具类公用实现

平时我们在开发后端管理的系统时,经常会出现导出Excel的功能.这个功能很简单,但是呢,我一般就会使用公用的工具类,在一个Util中,暴露公用导出的接口,只需要传入需要导出的数据(一般使用list集合)以及需要导出的key-value字段和值的模板(这里使用了org.json,更加轻量话). 一.废话不多说,直接先上暴露给用户的controller层的代码.这里呢,更改了header,通知浏览器打开下载功能(Content-Disposition 和attachment:filename一起使用