C# Excel处理工具
需求:選擇一個(gè)Excel文件,然后對(duì)該Excel文件進(jìn)行處理,再導(dǎo)出一個(gè)處理后的Excel文件。
效果圖
?
聲明:我對(duì)winform開(kāi)發(fā)不熟,但是我看到許多開(kāi)發(fā)人員做東西只管交差,從不考慮用戶體驗(yàn),也不考慮容錯(cuò)處理,我就在想,難道就不能做得專(zhuān)業(yè)一點(diǎn)嗎?當(dāng)你用別人做的東西,滿口吐槽的時(shí)候有沒(méi)有想過(guò)別人用你做的東西的時(shí)候,會(huì)不會(huì)一樣的狂噴呢?
這里對(duì)Excel的操作使用了NPOI.dll組件,可自行去網(wǎng)上現(xiàn)在或者使用NuGet下載。
界面皮膚
IrisSkin4.dll包括(73皮膚+vs2012兼容)?綠色版下載地址:http://pan.baidu.com/s/1eQ1sAUA
這里使用到了IrisSkin4.dll皮膚控件
使用方法:
1、添加IrisSkin4.dll引用
1、工具箱,添加此程序集
?
?
2、復(fù)制皮膚文件
?
設(shè)置皮膚文件的屬性
3、代碼調(diào)用
public frmMain(){InitializeComponent();//加載皮膚 skinEngine1.SkinFile ="Skins/Warm.ssk";skinEngine1.Active = true;skinEngine1.SkinDialogs = false;? //如果要讓某個(gè)控件不使用皮膚,則設(shè)置此屬性,這樣,就可以單獨(dú)為此控件設(shè)置屬性了,否則為此控件設(shè)置的屬性將會(huì)被皮膚屬性覆蓋lblShow.Tag = skinEngine1.DisableTag;lblMsg.Tag = skinEngine1.DisableTag;this.lblShow.ForeColor = Color.Red;this.lblMsg.ForeColor = Color.Green;}
關(guān)于excel的操作,這里還是使用NPOI.dll,可以自己從網(wǎng)上下載,也可以直接從vs的NuGet中下載。
需要注意的是,對(duì)于一些比較耗時(shí)的界面操作,建議使用一個(gè)進(jìn)度條,然后以異步調(diào)用的形式進(jìn)行操作。異步調(diào)用可以開(kāi)啟一個(gè)線程,如果在線程調(diào)用的代碼中需要修改窗體控件,也就是要修改主線程的內(nèi)容,可以使用如下代碼:
??Invoke(new?MethodInvoker(delegate?{?progressBar.Maximum?=?sheet.LastRowNum;?}));}
代碼很簡(jiǎn)單,這里我不做過(guò)多的說(shuō)明,詳情請(qǐng)參見(jiàn)代碼。
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; using System.Collections.Generic; using NPOI.HSSF.Util;namespace uuch.CustomsCheckPrint {//modify by:Zouqj 2015/4/9public 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; }/// <summary>/// 設(shè)置單元格樣式/// </summary>/// <param name="workbook"></param>/// <param name="cell"></param>private void setCellStyle(IWorkbook workbook, ICell cell){HSSFCellStyle fCellStyle = (HSSFCellStyle)workbook.CreateCellStyle();HSSFFont ffont = (HSSFFont)workbook.CreateFont();//ffont.FontHeight = 20 * 20;//ffont.FontName = "宋體";ffont.Color = HSSFColor.Red.Index;fCellStyle.SetFont(ffont);//fCellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直對(duì)齊//fCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平對(duì)齊cell.CellStyle = fCellStyle;}public void EditAndSave(string filePath, ProgressBar progressBar, Label label){// 0 , 1 , 2 , 3, 4, 5, 6// 收寄日期, 郵件號(hào), 寄達(dá)地, 類(lèi), 重量, 郵費(fèi), 省份//序號(hào) 提單號(hào) 快件單號(hào) 發(fā)件人 收件人 收件人地址 內(nèi)件名稱 數(shù)量 價(jià)值(USD) 重量(KG) 省份 首重費(fèi)用 續(xù)重費(fèi)用 OVS運(yùn)費(fèi) 操作費(fèi) OVS稅費(fèi)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"];string proviceNameB = ConfigurationManager.AppSettings["proviceNameB"];string[] economicProvince =null;string channelE = string.Empty; //經(jīng)濟(jì)渠道string channelS = string.Empty; //標(biāo)準(zhǔn)渠道if (rbtnA.Checked){channelE = ConfigurationManager.AppSettings["channelAE"];channelS = ConfigurationManager.AppSettings["channelAS"];economicProvince = string.IsNullOrEmpty(proviceNameA) ? null : proviceNameA.Split(',');}else if (rbtnB.Checked){channelE = ConfigurationManager.AppSettings["channelBE"];channelS = ConfigurationManager.AppSettings["channelBS"];economicProvince = string.IsNullOrEmpty(proviceNameB) ? null : proviceNameB.Split(',');}string pWeighFee = string.Empty; //首重費(fèi)string yWeighFee = string.Empty; //續(xù)重費(fèi)用string orderFee = string.Empty; //訂單費(fèi) 操作費(fèi) fsRead.Close();//ISheet sheet = workbook.GetSheetAt(0);var lackProvinceCount = 1;var sheetCount = workbook.NumberOfSheets;int successCounts = 0;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).StringCellValue.ToString().Trim(); //省份if (targetProvince.IsNullOrEmpty()){Invoke(new MethodInvoker(delegate { lblShow.Text += String.Format("{0} 郵件號(hào): {1} 缺少目標(biāo)地省份!\r\n", lackProvinceCount.ToString("00000"), row.GetCell(1).StringCellValue); }));lackProvinceCount++;continue;}if (targetProvince.Contains("省")){targetProvince = targetProvince.Replace("省", "");}var channelCode = economicProvince.Contains(targetProvince) == true ? channelE : channelS; //根據(jù)省份獲取渠道代碼var sSelectProvince = String.Format("SELECT Base_PlaceID FROM Base_Place WHERE CnName LIKE '%{0}%' ", targetProvince);var resultContry = sc.Query(sSelectProvince, null).FirstOrDefault();if (resultContry == null){setCellStyle(workbook, row.GetCell(10));continue;}var countryID = resultContry["Base_PlaceID"].ToString();var sSelectChannel = String.Format("SELECT Base_ChannelInfoID FROM Base_ChannelInfo WHERE ChannelCode = '{0}' ", channelCode);var resultChannel= sc.Query(sSelectChannel, null).FirstOrDefault();if (resultChannel == null){setCellStyle(workbook, row.GetCell(10));continue;}var channelID = resultChannel["Base_ChannelInfoID"].ToString();string sql = string.Format(@"select SalesPrice, CalStyle from v_Price_PriceInfo where SubChannelCode='{0}' and charindex ('{1}',AreaCountry)>0", channelCode, countryID);// 銷(xiāo)售價(jià) 計(jì)算方式 P:首重 Y:續(xù)重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();}}}else{setCellStyle(workbook, row.GetCell(10));continue;}successCounts++;// 執(zhí)行運(yùn)費(fèi)計(jì)算 " 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));//首重費(fèi)用 11var cellpWeighFee = row.GetCell(11);cellpWeighFee.SetCellType(CellType.Numeric);cellpWeighFee.SetCellValue(pWeighFee.ToDouble());//續(xù)重費(fèi)用 12var cellyWeighFee = row.GetCell(12);cellyWeighFee.SetCellType(CellType.Numeric);cellyWeighFee.SetCellValue(yWeighFee.ToDouble());//OVS運(yùn)費(fèi) 13var cellShipFee = row.GetCell(13);cellShipFee.SetCellType(CellType.Numeric);cellShipFee.SetCellValue(shipFeeRs.ToDouble());//操作費(fèi) 14var 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; })); //異步顯示進(jìn)度條 System.Windows.Forms.Application.DoEvents();}Invoke(new MethodInvoker(delegate { lblShow.Text = string.Format("計(jì)算成功!成功數(shù):{0}", successCounts); }));if (sheet.LastRowNum != successCounts){Invoke(new MethodInvoker(delegate { lblShow.Text += string.Format(" 有計(jì)算不出的數(shù)據(jù){0}條,請(qǐng)核對(duì)數(shù)據(jù)或格式是否有誤!", sheet.LastRowNum - successCounts); }));}}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("計(jì)算還沒(méi)結(jié)束, 確定退出?", "確定退出?", 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 = "請(qǐng)先選擇要計(jì)算的文件!\r\n";return;}if (string.IsNullOrEmpty(textBoxOutputPath.Text)){lblShow.Text = "必須制定輸出文件路徑和名稱!\r\n";return;}lblShow.Text = "";//兩種結(jié)算方式try{Thread t = new Thread(new ThreadStart(Single));t.IsBackground = true;t.Start(); }catch (Exception ex){LogAPI.WriteLog(ex.Message);lblShow.Text=ex.Message;//"計(jì)算錯(cuò)誤,詳情請(qǐng)查看日志!"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;}}} } View CodeApp.config
<?xml version="1.0"?> <configuration><appSettings><add key="connectionString" value="Data Source=192.xx.2.xxx;Initial Catalog=xxx;Persist Security Info=True;User ID=xx;Password=xxxx"/><add key="EnbleLog" value="false"/><!--是否開(kāi)啟日志:true,false--><add key="LogUrl" value="D:/"/><add key="LogName" value="計(jì)費(fèi)日志.txt"/><add key="themeName" value="Warm.ssk"/><!--結(jié)算方式A一--><!--渠道--><add key="proviceNameA" value="上海,江蘇,浙江,北京,安徽"/><!--這些省走經(jīng)濟(jì)快遞渠道--><add key="channelAE" value="GZExpress_E"/> <!--經(jīng)濟(jì)快遞渠道代碼--><add key="channelAS" value="GZExpress_S"/> <!--標(biāo)準(zhǔn)快遞渠道代碼--><!--結(jié)算方式B 帝途一--><add key="proviceNameB" value="北京,上海,江蘇,浙江,天津"/><!--這些省走經(jīng)濟(jì)快遞渠道--><add key="channelBE" value="GZExpress_E1"/><!--經(jīng)濟(jì)快遞渠道代碼--><add key="channelBS" value="GZExpress_S1"/><!--標(biāo)準(zhǔn)快遞渠道代碼--></appSettings><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="NPOI" publicKeyToken="0df73ec7942b34e1" culture="neutral"/><bindingRedirect oldVersion="0.0.0.0-2.1.3.1" newVersion="2.1.3.1"/></dependentAssembly><dependentAssembly><assemblyIdentity name="NPOI.OOXML" publicKeyToken="0df73ec7942b34e1" culture="neutral"/><bindingRedirect oldVersion="0.0.0.0-2.1.3.1" newVersion="2.1.3.1"/></dependentAssembly></assemblyBinding></runtime> </configuration> View Code轉(zhuǎn)載于:https://www.cnblogs.com/jiekzou/p/4425642.html
總結(jié)
以上是生活随笔為你收集整理的C# Excel处理工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: boot版本是什么 cent os_BO
- 下一篇: UnityC#实现中文汉字转拼音-使用微