嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣扎啦,不知道从哪下手,而且自己针对一个文件下载的小小练习还是写过的,但是和项目中的下载完全就是两个世界,所以我只能抱着学习的心情查找资料啦,刚开始由于leader没有说怎么个下载的办法,我只能自己看些有关下载的资料啦,周一只是在猜测的学习,然后通过询问各路大神。就新学习了NOPI,当我看到Nopi下载表格数据的时间,我发现NOPI好优越啊,我之前还不知道的那,所以简单的学习一下的啦。

一.NPOI的简单学习

下面就简单的总结一个最简单的表格下载方法:

        public static void GetDownLoaMonthExal(List<UserModel> model)
{
//表头
string[] exalHead = { "用户名", "密码"};
var workbook = new HSSFWorkbook();
//表格显示的名字
var sheet = workbook.CreateSheet("报表");
//记得在这里创建表头部对象,不能每次创建
//sheet.CreateRow(0).CreateCell(0).SetCellValue(exalHead[i])
var col = sheet.CreateRow();
//遍历表头在exal表格中
for (int i = ; i < exalHead.Length; i++)
{
//报表的头部
col.CreateCell(i).SetCellValue(exalHead[i]);
}
int a = ;
//遍历表数据
foreach (var item in model)
{
var row = sheet.CreateRow(a);
row.CreateCell().SetCellValue(item.TAISYOU_GTD);
row.CreateCell().SetCellValue(item.TEIKEI_CNT_1);
a++;
}
var file = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "1.xls", FileMode.Create);
workbook.Write(file);
file.Close();
}

上面就是简单的把网页上面的数据下载到Excel文件中,仅仅限制于简单的表格,并没有设置表格的样式以及颜色的;不过说起来使用NPOI,首先要下载NPOI,或者添加Nuget包即可,然后添加引用NPOI.HSSF.UserModel的引用,我们即可使用类HSSFWorkbook,然后创建对象,设计我们的表头和表数据。

好啦下面总结一下在MVC中实现和网站不同服务器的批量文件下载,其实周三Lender告诉我要实现这样的一个下载,我就不知打所措啦,在网上找了一些资料,感觉好多,但是有些乱,而且大家都理解为是在网站的根目录,这样据友友说并没有那么难的啦,我不知道怎么去实现,后来只能求助或者仍然寻找资料啦,昨天我是这样解决的,就总结一下吧。

二.下载服务器上Excel文件保存在本机

首先我们会涉及到两个View页面,在这里我举例的是Index和ShowDl,首先在Index页面上面有个要下载的按钮,我们点击按钮即可跳到下一个页面,即ShowDl,代码如下:

        //第一个参数为显示的文本,第二个参数为Action的名字,第三个为Controller的名字
@Html.ActionLink("下载文件", "Show", "Download")

当我们跳转到ShowDl的Action之后,我们需要查询我们需要下载的文件在此页面上面,即代码如下:

        public ActionResult ShowDl()
{
//文件路径配置在webconfig中的appconfig中,因此获取文件路径即可
string filePath = ConfigurationManager.AppSettings["Download"];
//获取文件的绝对路径以及文件名
string[] fPath = Directory.GetFiles(filePath);
List<string> fileName = new List<string>();
//仅仅获取文件名
foreach (var item in fPath)
{
                fileName.Add(Path.GetFileName(item));
}
//创建一个ViewData,在view上面遍历文件名字
ViewData["fileName"] = fileName;
return View();
}

View页面的显示文件名字如下:

<table>
@{ List<string> fileName = ViewData["fileName"] as List<string>;}
@if (fileName.Count > )
{
foreach (string item in fileName)
{
<tr>
<td>文件名:</td>
<td>@item</td>
<td><input type="checkbox" class="dDown" value="@item" />选择下载</td>
</tr>
}
}
<tr>
<td><input type="button" id="download" value="下载文件" onclick="Download()" /></td>
<td><input type="button" id="allCheck" value="全选" onclick="checkAll()" /></td>
</tr>
</table>
<script>
function Download() {
var str = [];//定义一个数组
$('.dDown:checked').each(function () {//遍历每一个名字为dol的复选框,其中选中的执行函数
str.push($(this).val());//将选中的值添加到数组str中
});
$.ajax({
type: "POST",
url: "/Home/DownloadFile",
contentType: "application/json",
data: JSON.stringify(str)
});
};
function checkAll() {
$('.dDown').each(function () {
$(this).attr("checked", "checked"); //设置属性为全部选中
});
};
</script>

此时我们选择了在ShowDl页面上显示的所有文件的名字,然后我们在此页面上面设置了两个按钮,一个是点击按钮现在文件,一个是全选,当点击下载按钮时间,用的是ajax直接异步跳到下面的HomeController中DownloadFile,代码如下:

        [HttpPost]
public FileResult DownloadFile(List<string> list)
{
//获取服务器中的文件路径
string filePath = ConfigurationManager.AppSettings["Download"];
//要压缩的文件夹,把需要打包的文件存放在此文件夹
string dPath = @"E:\文件";
//压缩后的文件存放路径
string destFile = @"E:\文件\Download";
if (list.Count > )
{
foreach (string fileName in list)
{
string sourceFileName = Path.Combine(filePath, fileName) + ".xls";
string destFileName = Path.Combine(dPath, fileName) + ".xls";
//true为覆盖同名文件
System.IO.File.Copy(sourceFileName, destFileName, true);
}
FileDown fileDown = new FileDown();
//返回压缩后的文件提供下载
fileDown.ZipFileFromDirectory(dPath, destFile, );
//参数为文件存放路径,下载的文件格式,文件名字
return File(destFile, "application/octet-stream", Path.GetFileName(destFile));
}
else
{
//单个文件下载,不需要打包
foreach (string fileName in list)
{
string sourceFileName = Path.Combine(filePath, fileName) + ".xls";
string destFileName = Path.Combine(dPath, fileName) + ".xls";
System.IO.File.Copy(sourceFileName, destFileName, true);
}
//参数为文件存放路径,下载的文件格式,文件名字
return File(destFile, "application/csv", Path.GetFileName(destFile));
}
}

上面是在Action中实现了下载,其实这个友友也帮啦好多忙的,嘿嘿,首先说在WebConfig中配置但是在上面中调用了一位友友修改的方法,我就直接拿来用啦,蛮好用的,嘿嘿,而且我看了ZipFile类中的几个方法,下面是那个方法,我也贴出来啦,嘿嘿,又有看到不要介意哈。

 /// 所有文件缓存
List<string> files = new List<string>(); /// 所有空目录缓存
List<string> paths = new List<string>(); /// <summary>
/// 压缩目录(包括子目录及所有文件)
/// </summary>
/// <param name="rootPath">要压缩的根目录</param>
/// <param name="destinationPath">保存路径</param>
/// <param name="compressLevel">压缩程度,范围0-9,数值越大,压缩程序越高</param>
public void ZipFileFromDirectory(string rootPath, string destinationPath, int compressLevel)
{
GetAllDirectories(rootPath);
//得到当前路径的位置,以备压缩时将所压缩内容转变成相对路径。
string rootMark = rootPath + "\\";
//Crc32校验
Crc32 crc = new Crc32();
//zip输出类
ZipOutputStream outPutStream = new ZipOutputStream(File.Create(destinationPath));
// 0-9程序的压缩,设置压缩程度
outPutStream.SetLevel(compressLevel);
//将文件读入压缩流
foreach (string file in files)
{
FileStream fileStream = File.OpenRead(file);
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, , buffer.Length);
//设置文件的一些参数
ZipEntry entry = new ZipEntry(file.Replace(rootMark, string.Empty));
entry.DateTime = DateTime.Now;
entry.Size = fileStream.Length;
fileStream.Close();
//计算Crc32检验码
crc.Reset();
crc.Update(buffer);
//设置校验码
entry.Crc = crc.Value;
//将当前文件的zip文件流写入输出流
outPutStream.PutNextEntry(entry);
outPutStream.Write(buffer, , buffer.Length);
}
this.files.Clear();
foreach (string emptyPath in paths)
{
ZipEntry entry = new ZipEntry(emptyPath.Replace(rootMark, string.Empty) + "/");
outPutStream.PutNextEntry(entry);
}
this.paths.Clear();
outPutStream.Finish();
outPutStream.Close();
GC.Collect();
} /// <summary>
/// 取得目录下所有文件及文件夹,分别存入files及paths
/// </summary>
/// <param name="rootPath">根目录</param>
private void GetAllDirectories(string rootPath)
{
//获取所有的子目录
string[] subPaths = Directory.GetDirectories(rootPath);
foreach (string path in subPaths)
{
//找到子目录并将当前目录的文件名存入List
GetAllDirectories(path);
}
string[] files = Directory.GetFiles(rootPath);
foreach (string file in files)
{
//将当前目录中的所有文件全名存入文件list
this.files.Add(file);
}
//判断是否是空目录
if (subPaths.Length == files.Length && files.Length == )
{
//如果是空目录则记录空目录
this.paths.Add(rootPath);
}
}

好啦,就写到这里啦,嘿嘿,项目最后一个就是下载的啦,昨天上午已完成,坐等接下来的任务啦,加油加油,我不知道的太多啦,希望友友们知道的帮忙哈。。。

在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习的更多相关文章

  1. ASP.NET MVC中使用Dropzone.js实现图片的批量拖拽上传

    说在前面 最近在做一个MVC相册的网站(这里),需要批量上传照片功能,所以就在网上搜相关的插件,偶然机会发现Dropzone.js,试用了一下完全符合我的要求,而且样式挺满意的,于是就在我的项目中使用 ...

  2. 如何从投票的网站的管理后台导出已投票的邀请码数据至Excel,并且稍修改,再导入到现场抽奖软件中?

    第一步:进入投票网站的管理后台,导出 已投票 的 邀请码 相关信息至Excel中,下图所示: 并且 删除第一行表头汉字信息. 第二步:把第A列 数值 信息 转换 为 文本 信息(注:转换方法详细点击此 ...

  3. MVC中Controller控制器相关技术

    第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...

  4. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  5. MVC中页面的传值方式总结

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...

  6. MVC中页面传值方式总结

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一.Controller----------->View(控制器传到视图) 1.View ...

  7. SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)

        在一个网站启动.结束时,我们经常有些操作是需要执行的. 熟悉Asp.net的朋友,使用Global.asax很容易就搞定,在其中有Application_Start和Application_E ...

  8. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  9. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

随机推荐

  1. Linux 常用小命令

    1.  查看目录的总和 du -sh 路径 2. 查看linux目录下所有某种类型的文件的行数--> 就是想看自己写了多少行代码 find /opt/code/zk_css -name '*.p ...

  2. jQuery AJAX中文乱码处理

    最近工作中用jQuery ajax返回出现乱码,用的Notepad++编辑器,当JS部分传递中文时,另一页面接收的话会出现乱码,在网上找了很多方法,基本上没有很好的解决. 页面用GB2312编码,JS ...

  3. 【转】JS对Cookie的读写删除

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的.而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一种 ...

  4. Python之Python 安装环境搭建

    方法和步骤: python安装包的下载:http://111.13.109.34:83/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/www.python.org/ftp/python ...

  5. Python——os(一)进程参数

    python的os模块提供了一种使用操作系统相关函数的通用手段,如果只是想读或写文件请移步 open(),向操作路径请查阅 os.path 模块,如果想要读取命令行中所有文件里的所有行请查阅 file ...

  6. (实用)win7/8修改远程桌面连接默认端口

    记录备忘. 在启用windows操作系统的远程连接时,使用默认的3389端口是一件比较危险的事情,通常我们将其改成一个比较独特的端口,使得目标系统不会直接将远程桌面连接的功能直接暴露在网络环境下. 步 ...

  7. asp.net gridview实现正在加载效果方案一AJAX(转)

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  8. mysql 找不到或无法加载已注册的 .Net Framework Data Provider和Unable to find the requested .Net Framework Data Provider. It may not be installed解决

    需要安装 mysql-connector-net-6.7.4.msi 在C盘安装mysql的位置找到三个DLL,复制到Bin文件夹下 在Web.config文件中添加对应配置: <system. ...

  9. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  10. vue select二级城市联动及第二级默认选中第一个option值

    当二级联动比如选择国家的时候,希望选中一个国家的时候后面城市默认选中第一个城市,则给国家的select加一个@change事件就可以了 <div class="inputLine&qu ...