每次用到这个都要去百度,这里记录一下,xls和xlsx两种格式设置背景颜色的区别,这里省略了前面读取模板或者创建excel的过程: xls:
1 2 3 4 5 6 7 8 9 10 11 |
ICellStyle style = workbook.CreateCellStyle(); //使用NPOI已经有的颜色创建 style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index; style.FillPattern = FillPattern.SolidForeground; //没有的颜色,使用RGB值进行创建 //这里要自定义一个颜色板覆盖掉原来的index,这里覆盖48号位置上的 HSSFPalette palette = ((HSSFWorkbook)workbook).GetCustomPalette(); palette.SetColorAtIndex(48, 0, 112, 192); style.FillForegroundColor = palette.FindColor(0, 112, 192).Indexed; |
xlsx:
1 2 3 4 5 6 7 8 9 10 |
ICellStyle style = workbook.CreateCellStyle(); //使用NPOI已经有的颜色创建(这里跟xls一样,不知道为什么可以通用) style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index; style.FillPattern = FillPattern.SolidForeground; //使用没有的颜色,这里和xls不一样,不需要覆盖掉原来的色板 style.FillForegroundColor = 0; style.FillPattern = FillPattern.SolidForeground; ((XSSFColor)style.FillForegroundColorColor).SetRgb(new byte[] { 0, 176, 240 }); |
from:https://blog.csdn.net/qq_34452824/article/details/119379559
View DetailsNPOI生产.xlsx文件件时,在使用book.Write(ms);后,会关闭流,这样导致再次使用Respons输出流的时候就出错了。 我看到一些网友提供的解决办法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class NPOIMemoryStream : MemoryStream { /// <summary> /// 获取流是否关闭 /// </summary> public bool IsColse { get; private set; } public NPOIMemoryStream(bool colse = false) { IsColse = colse; } public override void Close() { if (IsColse) { base.Close(); } } } |
使用自定义流代替内存流,这样就可以保证流不会被自定关闭了 from:https://www.cnblogs.com/caoyc/p/6215210.html
View Details原本使用 IWorkbook 中的HSSFWorkbook,代表 xls文件,最大导出行为65536,当数据量过大时,使用XSSFWorkbook,代表Xlsx文件,提供更多的行与列,在使用XSSFWorkbook写入MemoryStream时,提示Cannot access a closed Stream,是因为在使用book.Write(ms);后,会关闭流; 百度过后,使用自定义流代替内存流,这样就可以保证流不会被自定关闭了 解决方案可参考https://www.cnblogs.com/caoyc/p/6215210.html文章 ———————————————— 版权声明:本文为CSDN博主「SupperDuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dpq980522/article/details/129643588
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
XSSFWorkbook workbook = new XSSFWorkbook(); //创建工作簿 XSSFSheet sheet = (XSSFSheet)workbook.CreateSheet("test"); //创建表单 XSSFRow headerRow = (XSSFRow)sheet.CreateRow(); //创建row headerRow.CreateCell().SetCellValue(); headerRow.CreateCell().SetCellValue(); using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); //Response.Write(ms); Response.BinaryWrite(ms.ToArray()); Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); Response.AppendHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("test", System.Text.Encoding.UTF8) + ".xlsx"); Response.End(); } |
from:https://www.bbsmax.com/A/xl56OW01dr/
View Details1、在控制器获取要导出的数据 2、通过注入 IWebHostEnvironment 服务对象来获取根目录的物理路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public FileResult ToExcel() { //导出数据 DataTable dt = new DataTable("Table"); //获取路径 var strPath = Path.Combine(_webhostenvironment.ContentRootPath, AppConfigurtaion.Configuration["AppSettings:upload"]); string name = DateTime.Now.ToString("yyyyMMdd") + ".xls"; byte[] data = null; using (MemoryStream ms = ComFun.Export_ToExcel(dt, strPath, colname)) { data = ms.GetBuffer(); } return File(data, "application/vnd.ms-excel", name); } |
3、引用using NPOI.SS.UserModel;using NPOI.HSSF.UserModel; 4、获取导出excel所需模板 5、创建HSSWorkbook的对象用来调用NPOI文件,如果你导入的数据时没有调用ICellStyle类的对象设置的样式话,那么出来的数据在Excel是不加任何的样式。也就是说数据过多的话,数据会挤在一排,而且超出会隐藏。所以要设置ICellStyle的属性才行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public static MemoryStream Export_ToExcel(DataTable dt, string strpath, string[] colname) { //获取导出模板 string fileName = System.IO.Path.GetDirectoryName(strpath) + @"\resource\Excel.xls"; FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate); HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs); ISheet sheet = hssfworkbook.GetSheetAt(0); ICellStyle cellStyle = hssfworkbook.CreateCellStyle(); IRow row = sheet.CreateRow(0); for (int i = 0; i < colname.Length; i++) { string name = colname[i]; ICell cell = row.CreateCell(i); //在第一行中创建单元格 cell.CellStyle = cellStyle;//单元格添加样式 cell.SetCellValue(name);//循环往第二行的单元格中添加数据 } if (dt != null && dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { IRow rows = sheet.CreateRow(i + 1); for (int j = 0; j < colname.Length; j++) { string name = colname[j]; string columnval = dt.Rows[i][name].ToString(); ICell cell = rows.CreateCell(j); //在第二行中创建单元格 cell.CellStyle = cellStyle;//单元格添加样式 cell.SetCellValue(columnval);//循环往第二行的单元格中添加数据 } } } MemoryStream file = new MemoryStream(); hssfworkbook.Write(file); return file; } |
———————————————— 版权声明:本文为CSDN博主「归-途」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/w1824575989/article/details/125059544
View Details注意:Aop一定要设置在你操作语句之前,不然不会生效,还有必须是同一个SqlSuagrClient才会有效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public async Task<dynamic> GetNoPagingList([FromQuery] YkzptSafecompanypromiseListQueryInput input) { //每次Sql执行前事件 _db.Aop.OnLogExecuting = (sql, data) => { var n1 = sql; }; var data = await _db.Queryable<YkzptSafecompanypromiseEntity>() .WhereIF(!string.IsNullOrEmpty(input.warehouseId), p => p.WarehouseId.Equals(input.warehouseId)) .Select(it => new YkzptSafecompanypromiseListOutput { id = it.Id, warehouseId = it.WarehouseId, promiseDate = it.PromiseDate, mainPerson = it.MainPerson, promiseContent = it.PromiseContent, companyStateInfor = it.CompanyStateInfor, }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync(); return data; } |
全局
1 2 3 4 5 6 7 8 9 10 11 12 |
public DbContext() { Db = Instance; //调式代码 用来打印SQL Db.Aop.OnLogExecuting = (sql, pars) => { string s = sql; Console.WriteLine(sql + "\r\n" + Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; } |
from:https://www.cnblogs.com/canfengfeixue/p/15649378.html
View Details2022年5月27日,刚刚把VS2019升级到了VS2022,安装时已经不提供.NET Framework 4.0和.NET Framework 4.5的目标框架了,打开VS也提示不支持目标框架。
View Details解决方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static class Util { //由于api的特殊性,需要在我们发出请求前,解决未能建立安全通信通道问题,为这次连接设置安全认证 public static void SetCertificatePolicy() { ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } private static bool RemoteCertificateValidate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { // trust any certificate!!! System.Console.WriteLine("Warning, trust any certificate"); return true; } } |
写一个utils类,当你在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
class HttpUitls { public static class Util { //由于api的特殊性,需要在我们发出请求前,解决未能建立安全通信通道问题,为这次连接设置安全认证 public static void SetCertificatePolicy() { ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } private static bool RemoteCertificateValidate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { // trust any certificate!!! System.Console.WriteLine("Warning, trust any certificate"); return true; } } public static string Get(string Url) { Util.SetCertificatePolicy(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Proxy = null; request.KeepAlive = false; request.Method = "GET"; request.ContentType = "application/json; charset=UTF-8"; request.AutomaticDecompression = DecompressionMethods.GZip; //get请求,返回json文件 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); if (response != null) { response.Close(); } if (request != null) { request.Abort(); } return retString; } } |
1 |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); |
上面这个代码前添加这个方法 Util.SetCertificatePolicy(); 为本次连接设置证书。 from:https://blog.csdn.net/quentien/article/details/122326973
View Details由于系统需要在网页上导 出Excel文件,最近花了一段时间去学习NPOI插件。通过NPOI插件在服务端来生成Excel文件流并下载到本地。NPOI实际上和Excel一毛 钱关系都没有,它只是完全破译了Excel文件的存储格式,并用C#来生成同样的格式从而被识别为Excel文件。 NPOI和Excel VBA相比优点很多,首先是Excel VBA中的对象太多,而且是基于Visual Basic语言来书写,而且是在Excel中进行编程开发,IDE十分原始,没有任何的智能感知和代码着色功能。(最近可以在VS进行VBA开发了) 抛开这些不说,微软官方是不建议在服务器端来操作Excel的。原话好像是不建议用asp,asp.net等无人的方式来使用Excel。而且最要命的是 VBA方式来操作Excel后,其进程很难释放干净。在桌面端生成一两个文件倒无所谓,后台多跑两个Excel也不是啥大事。但在服务器端多用户操作,很 有可能会出现死锁等问题。 NPOI是从JAVA的POI移植而来,使用方式非常自然。 但是我发现在NPOI中实现宽度和高度自适应很难,宽度和高度自适应,说简单点就是如何让宽度和高度刚刚好。不让内容被遮挡,使用者在下载表格后不需要手工调整。 NPOI有一个宽度自适应属性,可惜只对英文和数字有效,对汉字无效。后来在一个台湾博客上发现了一段解决代码,我稍加改造后如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for (int columnNum = 0; columnNum <= 26; columnNum++) { int columnWidth = ffSheet.GetColumnWidth(columnNum) / 256;//获取当前列宽度 for (int rowNum = 1; rowNum <= ffSheet.LastRowNum; rowNum++)//在这一列上循环行 { IRow currentRow = ffSheet.GetRow(rowNum); ICell currentCell = currentRow.GetCell(columnNum); int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;//获取当前单元格的内容宽度 if (columnWidth < length + 1) { columnWidth = length + 1; }//若当前单元格内容宽度大于列宽,则调整列宽为当前单元格宽度,后面的+1是我人为的将宽度增加一个字符 } ffSheet.SetColumnWidth(columnNum, columnWidth * 256); } |
columnNum是列号,从0开始循环到表格最后一列,循环的范围可以自己指定,原理很简单,就是在先循环列,在列上循环行,比对行内容宽度与列宽度,若行内容宽度大于列宽则增大列宽,循环以后,每列宽度等于该列中最宽的那一行的宽度。 值得注意的是使用UTF8编码来计算的,在UTF8编码中数字和英文字母宽度为2,汉字宽度为3。而且字号越小,其效果就越好。在实际使用中内容为10磅的时候,其效果就相当不错。 仅仅有宽度自适应是不够的,宽度自适应只是针对较短的内容而言的,如果单元格内容很长采用这个方法会将表格拉的非常宽。下面来谈一谈高度自适应解决方法, 高度自适应是指内容换行后行高能够自动增加以完整的显示内容,高度自适应是我自己想出来的,和宽度自适应很类似:
1 2 3 4 5 6 7 |
for (int rowNum = 2; rowNum <= ffSheet.LastRowNum; rowNum++) { IRow currentRow = ffSheet.GetRow(rowNum); ICell currentCell = currentRow.GetCell(27); int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length; currentRow.HeightInPoints = 20 * (length / 60 + 1); } |
首先要设置该列能够自动换行,然后将行高设置为20,获得列内容宽度后整除一个列宽常数,将其倍数乘以行高,从而增加行高。值得注意的是这个常数需要自己 测试,因为实际内容都是英文、数字和汉字混杂的,很难判断一行能容纳多少个字符,只能取一个中间值,如果取的太大可能会造成行高小于内容,取的过小会造成 行高过大而内容较少。而且在字磅数较小时精度较好。 转载于:https://www.cnblogs.com/nearpengju123/p/4112935.html from:https://blog.csdn.net/weixin_30846599/article/details/99535103?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-99535103-blog-51893264.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-99535103-blog-51893264.pc_relevant_default&utm_relevant_index=2
View Details