现在有这样一个需求,.net后台程序有一个DataTable,把里面的数据写入到Excel,并且把这个Excel保存到服务器上的某个文件夹里,而不是直接下载,网上看了很多例子都是生成了Excel然后直接下载了,能否不直接下载,先保存到文件夹中,然后再提供下载呢?
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 }
这是我之前做的NPOI对Excel进行处理,保存到服务器指定文件夹,你看看改改就可以用,需要Nuget添加NPOI相关DLL
此方法可行,不过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: 对的,你说的那种方法我知道,但不满足我的那个需求,我的需求是通过代码生成EXCEL不能使用固定的模板。
那你就把写好数据的Excel保存在文件夹里就可以啦,file.SaveAs(mapPath);
这个是从客户端上传的方法哎,现在是没有Excel,要重新生成一个,然后保存到文件夹中,最好是能用NPOI来实现
@gyangjing: 你的意思是创建一个Excel把DataTable的数据写到Excel里保存在服务器的文件夹里面?
你看过的别人写的 代码,都已经生成了EXCEL文件了,你不想下载,那就把下载的代码去掉,就完了。
不要输出到页面,而是 save到服务器文件夹就好了。 推荐 closedxml
可以尝试下免费版的Spire.XLS,参考文章:
C# Excel 导入导出数据: http://e-iceblue.cn/spirexls/import-or-export-data.html