嘿嘿,我来啦,最近忙啦几天,使用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. 第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成

    第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成 apps目录建立 我们创建一个apps目录,将所有的app放到apps目录里去,这样方便管理,也 ...

  2. nginx rewrite和根据url参数location

    最近项目中涉及到旧老项目迁移,需要在nginx上做些配置,所以简单学习了下,好记性不如烂笔头,先记下来. rewrite 首先查看下nginx是否支持rewrite: ./nginx -V 不支持说明 ...

  3. Java如何重置正则表达式的模式?

    在Java编程中,如何重置正则表达式的模式? 以下示例演示如何使用Pattern类Pattern.compile()方法和Matcher类的m.find()方法来重置正则表达式的模式. package ...

  4. 定制库到Maven本地资源库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  5. EXP无法导出空表的表结构解决办法

    原文链接:http://www.cnblogs.com/Mr_JinRui/archive/2012/11/05/2755035.html 早的一次使用oracle 11g导出数据发现有的表丢失了,感 ...

  6. AMQ5540, AMQ5541 and AMQ5542, application did not supply a user ID and password, 2035 MQRC_NOT_AUTHORIZED

    Technote (troubleshooting) Problem(Abstract) As an MQ administrator you create a new queue manager i ...

  7. vegan 包进行Adonis 分析

    Adonis 分析 是基于距离矩阵的多变量方差置换分析, 代码示例: 默认使用bray 距离来计算样本间的距离矩阵 参考资料: https://www.rdocumentation.org/packa ...

  8. 【Access-Control-Allow-Origin】跨域问题

    [前言] 在实际项目中,可能是多个项目共同完成某个功能,他们之间需要实现数据的交互.这样就会需要有跨域的问题. 比如,发布在不同电脑上的不同项目之间,用不同语言开发的项目之间…… [JSONP] 当使 ...

  9. 【转】Spring Boot干货系列:(三)启动原理解析

    前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开Sprin ...

  10. linux mount 挂接新硬盘

    1.先用fdisk -l查看一下,先加入的外设地址名称   2. #fdisk /dev/sdb进入fdisk模式:Command (m for help):p //查看新硬盘的分区Command ( ...