关于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文件后, 运营同学可以自由自在的满足用户下载文件的需求

 

posted @ 2022-11-10 15:50  郎中令  阅读(287)  评论(1编辑  收藏  举报