一个学生本来是用vba来处理两个sheet(每个sheet里面的数据差不多2完条)中的数据,要求本来不复杂,但是用excel的vba来处理数据处理了差不多一天也没有处理完,差不多崩溃了,我也尝试了用vba来处理,不过觉得用vba来处理有些不爽,里面处理大数据量有些慢,虽然有优化的方法,但是我不想在vba花费时间了,我尝试用npoi来对excel处理。处理的时间差不多5分钟就完事了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS.UserModel; using System.IO; using System.Windows.Forms; namespace excel问题 { class model { public string id { get; set; } public string date { get; set; } public string value { get; set; } } class Program { [STAThread] static void Main(string[] args) { string appDirPath = System.AppDomain.CurrentDomain.BaseDirectory; OpenFileDialog of = new OpenFileDialog(); of.Filter = "excel|*.xlsx;*.xls"; if (of.ShowDialog() != DialogResult.OK) { return; } using (FileStream fs = File.OpenRead(of.FileName)) { Console.WriteLine("开始准备读取文件"); IWorkbook wb = WorkbookFactory.Create(fs); ISheet sh0 = wb.GetSheetAt(0); ISheet sh1 = wb.GetSheetAt(1); List<model> list = new List<model>(); Console.WriteLine("开始处理sheet2表"); for (int i = 1; i <=sh1.LastRowNum; i++) { Console.WriteLine("sheet2表第{0}行", i); model md = new model(); IRow row = sh1.GetRow(i); if (row.GetCell(0) != null) { md.id = row.GetCell(0).StringCellValue; } if (row.GetCell(1) != null) { md.date = row.GetCell(1).StringCellValue; } if (row.GetCell(2) != null) { md.value = row.GetCell(2).StringCellValue; } list.Add(md); } Console.WriteLine("处理sheet2表结束"); Console.WriteLine("----------------------------"); Console.WriteLine("开始处理sheet1表"); for (int i = 1; i <=sh0.LastRowNum; i++) { Console.WriteLine("sheet1表第{0}行", i); IRow row = sh0.GetRow(i); string value1 = row.GetCell(0).StringCellValue; string value2 = row.GetCell(1).StringCellValue; var result = list.Where(m => m.id == value1 && string.Compare(m.date, value2) >= 0).OrderBy(m=>m.date).Take(12); int count=0; foreach (var item in result) { row.CreateCell(5 + count++).SetCellValue(item.value); } } Console.WriteLine("正在写入处理结果,请稍候"); string newPath=appDirPath+"result.xlsx"; FileStream sw = File.Create(newPath); wb.Write(sw); sw.Close(); System.Diagnostics.Process.Start("explorer.exe","/select,\""+newPath+"\""); } } } }