首页 新闻 会员 周边

Asp.Net 生成Excel并保存到文件夹里

0
悬赏园豆:10 [已解决问题] 解决于 2017-12-14 20:09

现在有这样一个需求,.net后台程序有一个DataTable,把里面的数据写入到Excel,并且把这个Excel保存到服务器上的某个文件夹里,而不是直接下载,网上看了很多例子都是生成了Excel然后直接下载了,能否不直接下载,先保存到文件夹中,然后再提供下载呢?

gyangjing的主页 gyangjing | 初学一级 | 园豆:4
提问于:2017-11-30 10:20
< >
分享
最佳答案
1
  1 public class KpiTemplateExcelHelper
  2     {
  3         private IWorkbook _workBook = null;
  4         public IWorkbook workBook
  5         {
  6             get { return _workBook; }
  7         }
  8         private FileStream _fsOld = null;
  9         
 10         /// <summary>
 11         /// 用于暂时存储临时生成的文件名
 12         /// </summary>
 13         private string _temporaryWorkName;
 14 
 15         private readonly string domainPath = AppDomain.CurrentDomain.BaseDirectory;
 16 
 17         private KpiTemplateExcelHelper() { }
 18         public KpiTemplateExcelHelper(string workName)
 19         {
 20             _temporaryWorkName = workName + "Temporary" + ".xls";
 21             string filePath = this.GetFilePath(workName + ".xls");
 22             this.WorkBookInitialization(out _workBook,filePath);
 23         }
 24 
 25         /// <summary>
 26         /// 获取文件地址
 27         /// </summary>
 28         /// <param name="workName">考核表模板名称</param>
 29         /// <returns></returns>
 30         public string GetFilePath(string workName)
 31         {
 32             string filePath = domainPath + @"template\" + workName;
 33             if(!System.IO.File.Exists(filePath))
 34             {
 35                 throw new Exception("此文件不存在,请于管理员联系!");
 36             }
 37             return filePath;
 38         }
 39 
 40         /// <summary>
 41         /// 初始化Excel读取
 42         /// </summary>
 43         /// <param name="workBook"></param>
 44         /// <param name="filePath"></param>
 45         public void WorkBookInitialization(out IWorkbook workBook,string filePath)
 46         {
 47             try
 48             {
 49                 using(_fsOld = new FileStream(filePath,FileMode.Open,FileAccess.ReadWrite))
 50                 {
 51                     if(filePath.IndexOf(".xls") <= 0)
 52                     {
 53                         throw new Exception("此文件格式不正确,请于管理员联系!");
 54                     }
 55                     workBook = new HSSFWorkbook(_fsOld);
 56                 }
 57             }
 58             catch(Exception e)
 59             {
 60                 throw e;
 61             }
 62             finally
 63             {
 64                 _fsOld.Close();
 65             }
 66         }
 67 
 68         /// <summary>
 69         /// 对处理过的文件进行另存为新文件并返回、同时删除新文件
 70         /// </summary>
 71         /// <param name="oldWorkBook"></param>
 72         /// <returns></returns>
 73         public IWorkbook GetTemplateWork(IWorkbook oldWorkBook)
 74         {
 75             try
 76             {
 77                 string filePath = domainPath + @"template\" + _temporaryWorkName;
 78                 if(System.IO.File.Exists(filePath))
 79                 {
 80                     System.IO.File.Delete(filePath);
 81                 }
 82                 using(_fsOld = new FileStream(filePath,FileMode.CreateNew,FileAccess.ReadWrite))
 83                 {
 84                     _fsOld.Flush();
 85                     oldWorkBook.Write(_fsOld);
 86                     _fsOld.Close();
 87                     FileStream _fsNew = null;
 88                     try
 89                     {
 90                         using(_fsNew = new FileStream(filePath,FileMode.Open,FileAccess.Read))
 91                         {
 92                             if(filePath.IndexOf(".xls") <= 0)
 93                             {
 94                                 throw new Exception("此文件格式不正确,请于管理员联系!");
 95                             }
 96                             var newWorkBook = new HSSFWorkbook(_fsNew);
 97                             _fsNew.Close();
 98                             System.IO.File.Delete(filePath);
 99                             return newWorkBook;
100                         }
101                     }
102                     catch(Exception e)
103                     {
104                         throw e;
105                     }
106                     finally
107                     {
108                         _fsNew.Close();
109                     }
110                 }
111             }
112             catch(Exception e)
113             {
114                 throw e;
115             }
116             finally
117             {
118                 _fsOld.Close();
119             }
120         }
121     }
View Code

这是我之前做的NPOI对Excel进行处理,保存到服务器指定文件夹,你看看改改就可以用,需要Nuget添加NPOI相关DLL

收获园豆:5
猫出没 | 菜鸟二级 |园豆:219 | 2017-11-30 11:22

此方法可行,不过NPOI也有简单的方法,就是先在某个位置新建一个Excel,然后讲数据写入这个Excel中去:

public static void NPOICreateExcel(string fullPath)
{
HSSFWorkbook hssfworkbook = null;
FileStream file = null;
try
{
hssfworkbook = new HSSFWorkbook();
var sheet = hssfworkbook.CreateSheet("Sheet1");
using (file = new FileStream(fullPath, FileMode.Create))
{
hssfworkbook.Write(file);
file.Close();
}
}
catch (Exception e)
{
throw e;
}

}

gyangjing | 园豆:4 (初学一级) | 2017-12-14 20:11

@gyangjing: 对的,你说的那种方法我知道,但不满足我的那个需求,我的需求是通过代码生成EXCEL不能使用固定的模板。

猫出没 | 园豆:219 (菜鸟二级) | 2018-01-02 10:57
其他回答(4)
0

那你就把写好数据的Excel保存在文件夹里就可以啦,file.SaveAs(mapPath);

最佳解决方案 | 园豆:25 (初学一级) | 2017-11-30 10:29

这个是从客户端上传的方法哎,现在是没有Excel,要重新生成一个,然后保存到文件夹中,最好是能用NPOI来实现

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2017-11-30 11:04

@gyangjing: 你的意思是创建一个Excel把DataTable的数据写到Excel里保存在服务器的文件夹里面?

支持(0) 反对(0) 最佳解决方案 | 园豆:25 (初学一级) | 2017-11-30 11:13
0

你看过的别人写的 代码,都已经生成了EXCEL文件了,你不想下载,那就把下载的代码去掉,就完了。

西漠以西 | 园豆:1675 (小虾三级) | 2017-11-30 11:07
0

不要输出到页面,而是 save到服务器文件夹就好了。 推荐 closedxml 

乁卬杨 | 园豆:387 (菜鸟二级) | 2017-11-30 15:59
0

可以尝试下免费版的Spire.XLS,参考文章:

C# Excel 导入导出数据: http://e-iceblue.cn/spirexls/import-or-export-data.html

收获园豆:5
ms_doudou | 园豆:1166 (小虾三级) | 2017-12-01 17:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册