关于NPOI操作(二) 导出数据到文件
经常收到研发支援单, 需要帮客户导出 某主题/某活动下某些成百上千的指定用户上传的文件(图片,视频等), 本来管理后台是有导出功能的, 但是达不到客户心血来潮的要求, 有时候时客户退租,需要拷贝上传数据,索性就花费了午休时间, 封装了一个Winform工具, 丢给运营支持, 以后就不会再来找研发, 毕竟大家都很忙. 话不多说先上思路, 其实很简单, sql 查询捞出 活动-用户-文件url 等信息保存到excle, 或者客户会直接提供这些文件信息, 这都是前提, 那么在此前提下, 只需要用程序去读取文件将里面的数据一一 下载下来就好.
第一步, 创建 winform 窗体程序, 引用NPOI 库, 和日志Nlog, 直接掠过.
第二步, 封装一个Helper 类 , 将Excel 文件读取到Table 中, 先行后列
/// <summary> /// 读取excel文件数据到DataTable /// </summary> /// <param name="filePath"></param> /// <param name="deleteFile"></param> /// <returns></returns> public static DataTable ReadExcelToTable(string filePath, bool deleteFile = false) { using (var tempFile = new FileStream(filePath, FileMode.Open)) { //var workbook = new WorkbookFactory.Create(fs); IWorkbook workbook = WorkbookFactory.Create(tempFile); var dataTable = new DataTable(); //读取栏位行数据 var sheet = workbook.GetSheetAt(0); var tableHeadRow = sheet.GetRow(0); for (int i = 0; i < tableHeadRow.PhysicalNumberOfCells; i++) { var headCell = tableHeadRow.Cells[i]; dataTable.Columns.Add(new DataColumn(headCell.StringCellValue)); } //读取数据行 for (int s = 0; s < workbook.NumberOfSheets; s++) { var sheetData = workbook.GetSheetAt(s); for (int i = 1; i < sheetData.PhysicalNumberOfRows; i++) { var row = sheetData.GetRow(i); var newRow = dataTable.NewRow(); for (int j = 0; j < row.PhysicalNumberOfCells; j++) { var cell = row.Cells[j]; cell.SetCellType(CellType.String); newRow[j] = cell.StringCellValue; } dataTable.Rows.Add(newRow); } } workbook.Close(); if (deleteFile) { File.Delete(filePath); } return dataTable; } }
第三步. 粗糙的 UI界面控件
第四步, 下载功能, 读取Table, 写文件 (条件那些校验已省略)
//遍历线程下载 public void TaskDwonFile(DataTable table) { //创建文件 var path = ConfigurationManager.AppSettings.Get("SavePath"); Directory.CreateDirectory(path); string selectTend = ckExtend.Checked ? comboBox1.Text: string.Empty; Task.Factory.StartNew(() => { int i = 10001; foreach (DataRow row in table.Rows) { try { i++; var Id = row[txtId.Text].ToString(); //标识 var userId = row[txtUserId.Text].ToString(); //用户Id var userName = row[txtname.Text].ToString(); //用户名 var urlPath = row[txtfilepath.Text].ToString(); //文件路径 var file = urlPath.Split('/'); var tempExtend = Path.GetExtension(urlPath); //取后缀 var extend = string.IsNullOrEmpty(tempExtend) ? selectTend : tempExtend; var savePath = path + "/" + userId + "_" + userName + "_" + i + extend; //拼接完整路径 DwonImg(urlPath, savePath); //下载 } catch (Exception ex) { NlogHelper.Default.Error("导入异常,{0}", ex); continue; } } }); }
第五步: 下载文件读取流
public void DwonImg(string url, string savePath) { WebResponse response = null; Stream stream = null; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); response = request.GetResponse(); stream = response.GetResponseStream(); if (!response.ContentType.ToLower().StartsWith("text/")) { SaveBinaryFile(response, savePath); } } finally { if (stream != null) stream.Close(); if (response != null) response.Close(); } }
如此 ,根据以上一番操作,打包bin文件后, 运营同学可以自由自在的满足用户下载文件的需求
大家好,我是新来的小白,文未佳,却已创。转载请声明(博客园-郎中令)出处,谢谢
---市人皆大笑,举手揶揄之(手动链接博客园)