好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

?

//打开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://HdhCmsTestcnblogs测试数据/liudiwei/p/6041641.html

dy("nrwz");

查看更多关于C# 文件上传下载(Excel导入,多线程下载)功能的实现代码的详细内容...

  阅读:44次