软件编程
位置:首页>> 软件编程>> C#编程>> C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

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

作者:大白菜1990  发布时间:2021-12-09 20:16:34 

标签:c#,上传,下载,多线程下载

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


//打开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导入,多线程下载)功能的实现代码网站的支持!

来源:http://www.cnblogs.com/liudiwei/p/6041641.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com