嘿嘿,我来啦,最近忙啦几天,使用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. 1<<30 hashMap 中使用位移运算的意义

    static final int MAXIMUM_CAPACITY = 1 << 30; 计算过程已1<<30为例,首先把1转为二进制数字 0000 0000 0000 000 ...

  2. TestNG 入门指导——理解testng.xml执行/不执行某个包,某个类,某个方法

    这一篇我们主要学习如下几个知识点: ⑴关于testng.xml ⑵创建一个测试套件 ⑶执行testng.xml ⑷在测试套件中创建多个测试用例 ⑸在用例中增加class,packages, metho ...

  3. Self20171218_Eclipse+TestNg HelloWorld

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

  4. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  5. Apache Commons CLI

    简单的说,就是对命令的参数进行定义和解析的工具 -- 这里说的参数是我们常用的说法,而CLI里则是Option.Options,参数值(如果有)则是Option的arg(s). ## 为什么 那么,为 ...

  6. VIM下的普通模式的相关知识

    什么为一次操作? 从进行插入模式开始,直到返回普通模式为止,在此期间的任何修改都视为一次操作:   使用 u 可以撤销最新的修改: 所以呢,控制好在插入模式的操作就可以控制好撤销命令的粒度: 另外,最 ...

  7. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  8. 嵌入式开发之hisilicon---hi3536 处理器简介

    (1)处理器概述 (2)处理器模块架构 --------------author:pkf -------------------time:7-19 -------------------------- ...

  9. Python——hashlib

    该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义), ...

  10. CentOS6.8下安装MySQL5.6

    一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...