废话不多说了,直接给大家贴代码,具体代码如下所示:
//打开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导入,多线程下载)功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# c#
# 文件上传下载
# 多线程下载
# C#多线程基础知识汇总
# C# 多线程编程技术基础知识入门
# 基于C#实现的轻量级多线程队列图文详解
# C#中的多线程小试牛刀
# C#中的多线程超时处理实践方案
# C#多线程之Semaphore用法详解
# C#多线程及同步示例简析
# C#多线程之Thread类详解
# C#多线程之线程控制详解
# 深入了解c#多线程编程
# 多线程
# 给大家
# 小编
# 下载完成
# 第一个
# 在此
# 下载地址
# 说了
# 不多
# 如果没有
# 实际情况
# 所示
# 转换为
# 所述
# 给我留言
# 感谢大家
# 单元格
# 疑问请
# 有任何
# 可根据
相关文章:
如何正确下载安装西数主机建站助手?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何在云虚拟主机上快速搭建个人网站?
c# await 一个已经完成的Task会发生什么
建站之星好吗?新手能否轻松上手建站?
如何快速搭建高效可靠的建站解决方案?
如何通过远程VPS快速搭建个人网站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
微课制作网站有哪些,微课网怎么进?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何用wdcp快速搭建高效网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
网站制作的步骤包括,正确网址格式怎么写?
如何使用Golang安装API文档生成工具_快速生成接口文档
网站网页制作专业公司,怎样制作自己的网页?
,购物网站怎么盈利呢?
建站之星代理费用多少?最新价格详情介绍
清除minerd进程的简单方法
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
创业网站制作流程,创业网站可靠吗?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何在景安服务器上快速搭建个人网站?
如何通过西部数码建站助手快速创建专业网站?
,有什么在线背英语单词效率比较高的网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何获取PHP WAP自助建站系统源码?
建站之星后台管理如何实现高效配置?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
海南网站制作公司有哪些,海口网是哪家的?
如何选择高效稳定的ISP建站解决方案?
如何彻底删除建站之星生成的Banner?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
建站之星如何实现PC+手机+微信网站五合一建站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站之星后台密码遗忘或太弱?如何重置与强化?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
山东网站制作公司有哪些,山东大源集团官网?
,怎么用自己头像做动态表情包?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
网站制作员失业,怎样查看自己网站的注册者?
Python文件管理规范_工程实践说明【指导】
广州营销型建站服务商推荐:技术优势与SEO优化解析
金*站制作公司有哪些,金华教育集团官网?
南京网站制作费用,南京远驱官方网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
开源网站制作软件,开源网站什么意思?
如何用y主机助手快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。