首页 > 编程 > C# > 正文

C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

2020-01-24 00:32:36
字体:
来源:转载
供稿:网友

废话不多说了,直接给大家贴代码,具体代码如下所示:

//打开Excel文件,转换为DataTable      DataTable dtExcel;    private void OpenFile()    {      OpenFileDialog dialog = new OpenFileDialog();      dialog.Filter = "Microsoft Excel files(*.xls)|*.xls;*.xlsx"; //筛选打开文件类型 :图片 *.jpg|*.jpg|*.bmp|*.bmp ;"音频文|*.mp3;*.wma;*.aac;*.midi;*.wav" 等等      if (dialog.ShowDialog() == DialogResult.OK)      {        dialogFileName = dialog.FileName;        dtExcel = ExcelToDataTable(dialogFileName, "sheet1", true);      }    }/// <summary>  /// Excel转Datatable  /// </summary>  /// <param name="fileName">文件名含后缀名</param>  /// <param name="sheetName">Excel文件,页名称</param>  /// <param name="isFirstRowColumn">是否将第一列作为表头</param>  /// <returns></returns>  private DataTable ExcelToDataTable(string fileName, string sheetName, bool isFirstRowColumn)  {   IWorkbook workbook = null;   FileStream fs = null;   ISheet sheet = null;   DataTable data = new DataTable();   int startRow = 0;   try   {    fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);    if (fileName.IndexOf(".xlsx") > 0) // 2007版本     workbook = new XSSFWorkbook(fs);    else if (fileName.IndexOf(".xls") > 0) // 2003版本     workbook = new HSSFWorkbook(fs);    if (sheetName != null)    {     sheet = workbook.GetSheet(sheetName);     if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet     {      sheet = workbook.GetSheetAt(0);     }    }    else    {     sheet = workbook.GetSheetAt(0);    }    if (sheet != null)    {     IRow firstRow = sheet.GetRow(0);     int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数     if (isFirstRowColumn)     {      for (int i = firstRow.FirstCellNum; i < cellCount; ++i)      {       ICell cell = firstRow.GetCell(i);       if (cell != null)       {        string cellValue = cell.StringCellValue;        if (cellValue != null)        {         DataColumn column = new DataColumn(cellValue);         data.Columns.Add(column);        }       }      }      startRow = sheet.FirstRowNum + 1;     }     else     {      startRow = sheet.FirstRowNum;     }     //最后一列的标号     int rowCount = sheet.LastRowNum;     for (int i = startRow; i <= rowCount; ++i)     {      IRow row = sheet.GetRow(i);      if (row == null) continue; //没有数据的行默认是null             DataRow dataRow = data.NewRow();      for (int j = row.FirstCellNum; j < cellCount; ++j)      {       if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null        dataRow[j] = row.GetCell(j).ToString();      }      data.Rows.Add(dataRow);     }    }    return data;   }   catch (Exception ex)   {    MyMessageBox.Show(ex.Message);    return null;   }  }

文件下载:

private void DownLoad()  {   if (impdefineBM != null)   {    FolderBrowserDialog path = new FolderBrowserDialog();    path.ShowDialog();    if (path != null && path.SelectedPath != "")    {     string url = @"http://192.168.1.1/XX.xls";  //下载地址     string name = "FileName";              // 文件名称     string savefilepath = path.SelectedPath + "//" + name + url.Substring(url.LastIndexOf(".")); //注意:下载文件名的命名 ,可根据实际需求调整调用的文件创建方式     MultiDownload download = new MultiDownload(5, url, savefilepath); //调用多线程下载     download.Start();    }   }  } #region 多线程下载  public class MultiDownload  {   #region 变量   private int _threadNum;    //线程数量   private long _fileSize;    //文件大小   private string _fileUrl;   //文件地址   private string _fileName;   //文件名   private string _savePath;   //保存路径   private short _threadCompleteNum; //线程完成数量   private bool _isComplete;   //是否完成   private volatile int _downloadSize; //当前下载大小(实时的)   private Thread[] _thread;   //线程数组   private List<string> _tempFiles = new List<string>();   private object locker = new object();   #endregion   #region 属性   /// <summary>   /// 文件名   /// </summary>   public string FileName   {    get    {     return _fileName;    }    set    {     _fileName = value;    }   }   /// <summary>   /// 文件大小   /// </summary>   public long FileSize   {    get    {     return _fileSize;    }   }   /// <summary>   /// 当前下载大小(实时的)   /// </summary>   public int DownloadSize   {    get    {     return _downloadSize;    }   }   /// <summary>   /// 是否完成   /// </summary>   public bool IsComplete   {    get    {     return _isComplete;    }   }   /// <summary>   /// 线程数量   /// </summary>   public int ThreadNum   {    get    {     return _threadNum;    }   }   /// <summary>   /// 保存路径   /// </summary>   public string SavePath   {    get    {     return _savePath;    }    set    {     _savePath = value;    }   }   #endregion   /// <summary>   /// 构造函数   /// </summary>   /// <param name="threahNum">线程数量</param>   /// <param name="fileUrl">文件Url路径</param>   /// <param name="savePath">本地保存路径</param>   public MultiDownload(int threahNum, string fileUrl, string savePath)   {    this._threadNum = threahNum;    this._thread = new Thread[threahNum];    this._fileUrl = fileUrl;    this._savePath = savePath;   }   public void Start()   {    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_fileUrl);    HttpWebResponse response = (HttpWebResponse)request.GetResponse();    _fileSize = response.ContentLength;    int singelNum = (int)(_fileSize / _threadNum);  //平均分配    int remainder = (int)(_fileSize % _threadNum);  //获取剩余的    request.Abort();    response.Close();    for (int i = 0; i < _threadNum; i++)    {     List<int> range = new List<int>();     range.Add(i * singelNum);     if (remainder != 0 && (_threadNum - 1) == i) //剩余的交给最后一个线程      range.Add(i * singelNum + singelNum + remainder - 1);     else      range.Add(i * singelNum + singelNum - 1);     //下载指定位置的数据     int[] ran = new int[] { range[0], range[1] };     _thread[i] = new Thread(new ParameterizedThreadStart(Download));     _thread[i].Name = System.IO.Path.GetFileNameWithoutExtension(_fileUrl) + "_{0}".Replace("{0}", Convert.ToString(i + 1));     _thread[i].Start(ran);    }    //MessageBox.Show("下载完成!");   }   private void Download(object obj)   {    Stream httpFileStream = null, localFileStram = null;    try    {     int[] ran = obj as int[];     string tmpFileBlock = System.IO.Path.GetTempPath() + Thread.CurrentThread.Name + ".tmp";     _tempFiles.Add(tmpFileBlock);     HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(_fileUrl);     httprequest.AddRange(ran[0], ran[1]);     HttpWebResponse httpresponse = (HttpWebResponse)httprequest.GetResponse();     httpFileStream = httpresponse.GetResponseStream();     localFileStram = new FileStream(tmpFileBlock, FileMode.Create);     byte[] by = new byte[5000];     int getByteSize = httpFileStream.Read(by, 0, (int)by.Length); //Read方法将返回读入by变量中的总字节数     while (getByteSize > 0)     {      Thread.Sleep(20);      lock (locker) _downloadSize += getByteSize;      localFileStram.Write(by, 0, getByteSize);      getByteSize = httpFileStream.Read(by, 0, (int)by.Length);     }     lock (locker) _threadCompleteNum++;    }    catch (Exception ex)    {     throw new Exception(ex.Message.ToString());    }    finally    {     if (httpFileStream != null) httpFileStream.Dispose();     if (localFileStram != null) localFileStram.Dispose();    }    if (_threadCompleteNum == _threadNum)    {     Complete();     _isComplete = true;    }   }   /// <summary>   /// 下载完成后合并文件块   /// </summary>   private void Complete()   {    Stream mergeFile = null;    BinaryWriter AddWriter = null;    try    {     using (mergeFile = new FileStream(@_savePath, FileMode.Create)) //根据实际情况调整FileMode     {      AddWriter = new BinaryWriter(mergeFile);      foreach (string file in _tempFiles)      {       using (FileStream fs = new FileStream(file, FileMode.Open))       {        BinaryReader TempReader = new BinaryReader(fs);        AddWriter.Write(TempReader.ReadBytes((int)fs.Length));        TempReader.Close();       }       File.Delete(file);      }     }     MyMessageBox.Show("下载完成!");    }    catch (Exception ex)    {     throw new Exception(ex.Message);    }    finally    {     if (AddWriter != null)     {      AddWriter.Close();      AddWriter.Dispose();     }     if (mergeFile != null)     {      mergeFile.Close();      mergeFile.Dispose();     }    }   }  }

总结

以上所述是小编给大家介绍的C# 文件上传下载(Excel导入,多线程下载)功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表