嘿嘿,我来啦,最近忙啦几天,使用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. 关于Unity的NGUI

    NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架 KISS原则:Keep It Simple,Stupid NGUI实例 1.创建U ...

  2. Self20171218_Eclipse+TestNg HelloWorld

    作为一个经典的入门例子,这里展示如何开始使用TestNG单元测试框架. 使用的工具 : TestNG 6.8.7 Maven 3 Eclipse IDE TestNG下载并安装 从这里 http:// ...

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

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

  4. C语言中的控制语句: 判断、环循等;

    列举这一部分的目的就是注意它的写法,尤其是 分号 : 的位置: 1. if-else if else 语句: if (表达式1) 语句1: else if (表达式2) 语句2: else 语句3: ...

  5. SpringMVC系列(五)使用 Serlvet 原生的 API 作为目标方法的参数

    SpringMVC的Handler方法可以接受哪些 ServletAPI 类型的参数 • HttpServletRequest• HttpServletResponse• HttpSession• j ...

  6. e774. 创建JList组件

    By default, a list allows more than one item to be selected. Also, the selected items need not be co ...

  7. TPshop标签

    很多cms 中有很多 标签, 商品标签 文章标签  列表标签  几十个标签, 让开发者头疼, 难记,  TPshop开发者考虑到这点, 用了一个万能标签, 开发者非常方便实用 TPshop万能标签只要 ...

  8. 弹出输入框后,将listview内容遮住,解决方案

    转自http://blog.csdn.net/silence_cdsn/article/details/7987063 更改listview的布局属性 之前的布局: <ListView andr ...

  9. mysql字段类型对应javabean属性

    来吧 我们一起看下图,就能明白了.

  10. js获取网页的url文件名( 例如index.aspx),js获取url的参数(例如获取 ?cid=joeylee的值),给jquery拓展方法

      <script type="text/javascript"> var JsRequest={ //这就是一个静态类,类里面有2个静态方法 //方法一:获取url的 ...