还是导出excel的问题

-一个大坑 2019-09-20 02:59:50
昨天的帖子只能回复3次,已经超了,所以新发了一个帖子,下面是我的代码

public static MemoryStream DataTableToExcel<T>(DataTable dt) where T : class, new()
{
XSSFWorkbook fileWorkbook = new XSSFWorkbook();
ISheet sheet = fileWorkbook.CreateSheet("Sheet1");

List<int> nonDownList = new List<int>();
List<int> columnWidthList = new List<int>();
List<string> columnNameList = new List<string>();
var type = typeof(T);
int nonDown = 0;
foreach (var porp in type.GetProperties())
{
nonDown++;
if (porp.IsDefined(typeof(ShowNameAttribute), true))
{
var showNameAttribute = porp.GetCustomAttribute<ShowNameAttribute>();
columnNameList.Add(showNameAttribute.ShowName);

var columnWidthAttribute = porp.GetCustomAttribute<ColumnWidthAttribute>();
var number = columnWidthAttribute == null ? columnWidth : columnWidthAttribute.Number;
columnWidthList.Add(number);
}
else
{
nonDownList.Add(nonDown);
}
}

//表头
IRow row = sheet.CreateRow(0);
for (int i = 0; i < columnNameList.Count; i++)
{
ICell cell = row.CreateCell(i); //創建單元格
cell.SetCellValue(columnNameList[i]); //表頭賦值
sheet.SetColumnWidth(i, columnWidthList[i]); //表頭寬度
cell.CellStyle = excelStyle.CellHeadStyle; //表頭樣式
row.Height = 30 * 20; //行高为30
}

//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
if (!nonDownList.Contains(j))
{
ICell cell = row1.CreateCell(j);
string drValue = dt.Rows[i][j].ToString();
CellStyle(cell, dt.Columns[j].DataType.ToString(), drValue);
}
}
}

//转为字节数组
using (MemoryStream ms = new MemoryStream())
{
fileWorkbook.Write(ms);
ms.Flush();
return ms;
}
}
...全文
210 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2019-09-23
  • 打赏
  • 举报
回复
引用 11 楼 stherix 的回复:
[quote=引用 10 楼 -一个大坑 的回复:] [quote=引用 7 楼 stherix 的回复:] 是这样的 每个不同的WorkBook的Style不能共用 因为CellStyle是要存储到具体的文件中的 具体NPOI为什么要这么实现我也搞不懂 没必要在构造函数里弄不同的工作簿名,但是可能需要针对每一个工作簿弄一个字典存放这些Style实例
CellStyle不能共用,那我public static ExcelStyle excelStyle { get;set; }是不是要加个锁,避免多人下载时excelStyle 改变导致下载失败[/quote] 每次来一个请求,你都new 一个新的 这样就不会重复了[/quote] 不是很清楚要怎么做,要怎么改
 public class ToExcel
    {
        private readonly int columnWidth = 3000;
        private readonly string strSheetName = "Sheet1";
        private ExcelStyle excelStyle  { get;set; }

        public MemoryStream DataTableToExcel(ExcelData excelData)
        {
            XSSFWorkbook fileWorkbook = new XSSFWorkbook();
            excelStyle = new ExcelStyle(fileWorkbook);
            ISheet sheet = fileWorkbook.CreateSheet();
            sheet = GetExcelSheet(sheet, excelData);

            //转为字节数组
            using (MemoryStream ms = new MemoryStream())
            {
                fileWorkbook.Write(ms);
                ms.Flush();
                return ms;
            }
        }
}

 public class NPOIHelper
    {
        private static ToDataTable toDataTable = new ToDataTable();
        private static ToExcel toExcel = new ToExcel();
        public static MemoryStream DataTableToExcel(ExcelData excelData)
        {
            return toExcel.DataTableToExcel(excelData);
        }
}
-一个大坑 2019-09-23
  • 打赏
  • 举报
回复
引用 12 楼 -一个大坑 的回复:
[quote=引用 6 楼 胖叔叔写代码 的回复:] [quote=引用 5 楼 -一个大坑 的回复:] 知道,不过那个都过了一天了应该没人回复了
你为啥要等人回复呢? 你知道sp1234有很多小号是为什么吗[/quote] 我多个属性都是一样的样式,都是写成CellStyle = cellStyle; 一改动所有的属性都改了,我又不想每个属性都加这段重复的样式要怎么办? ICellStyle cellStyle = fileWorkbook.CreateCellStyle(); cellStyle.Alignment = HorizontalAlignment.Center; //左右居中 cellStyle.VerticalAlignment = VerticalAlignment.Center; //上下居中 cellStyle.BorderTop = BorderStyle.Thin; //单元格上边框黑色 cellStyle.BorderBottom = BorderStyle.Thin; //单元格下边框黑色 cellStyle.BorderLeft = BorderStyle.Thin; //单元格左边框黑色 cellStyle.BorderRight = BorderStyle.Thin; //单元格右边框黑色 [/quote] 把它定义成一个方法,每次调用方法都是产生新的ICellStyle 就好了,以前都没注意用同一个class赋值,改变就所有被赋值的class都会改动
-一个大坑 2019-09-23
  • 打赏
  • 举报
回复
引用 6 楼 胖叔叔写代码 的回复:
[quote=引用 5 楼 -一个大坑 的回复:] 知道,不过那个都过了一天了应该没人回复了
你为啥要等人回复呢? 你知道sp1234有很多小号是为什么吗[/quote] 我多个属性都是一样的样式,都是写成CellStyle = cellStyle; 一改动所有的属性都改了,我又不想每个属性都加这段重复的样式要怎么办? ICellStyle cellStyle = fileWorkbook.CreateCellStyle(); cellStyle.Alignment = HorizontalAlignment.Center; //左右居中 cellStyle.VerticalAlignment = VerticalAlignment.Center; //上下居中 cellStyle.BorderTop = BorderStyle.Thin; //单元格上边框黑色 cellStyle.BorderBottom = BorderStyle.Thin; //单元格下边框黑色 cellStyle.BorderLeft = BorderStyle.Thin; //单元格左边框黑色 cellStyle.BorderRight = BorderStyle.Thin; //单元格右边框黑色
stherix 2019-09-23
  • 打赏
  • 举报
回复
引用 10 楼 -一个大坑 的回复:
[quote=引用 7 楼 stherix 的回复:] 是这样的 每个不同的WorkBook的Style不能共用 因为CellStyle是要存储到具体的文件中的 具体NPOI为什么要这么实现我也搞不懂 没必要在构造函数里弄不同的工作簿名,但是可能需要针对每一个工作簿弄一个字典存放这些Style实例
CellStyle不能共用,那我public static ExcelStyle excelStyle { get;set; }是不是要加个锁,避免多人下载时excelStyle 改变导致下载失败[/quote] 每次来一个请求,你都new 一个新的 这样就不会重复了
-一个大坑 2019-09-23
  • 打赏
  • 举报
回复
引用 7 楼 stherix 的回复:
是这样的 每个不同的WorkBook的Style不能共用 因为CellStyle是要存储到具体的文件中的 具体NPOI为什么要这么实现我也搞不懂 没必要在构造函数里弄不同的工作簿名,但是可能需要针对每一个工作簿弄一个字典存放这些Style实例
CellStyle不能共用,那我public static ExcelStyle excelStyle { get;set; }是不是要加个锁,避免多人下载时excelStyle 改变导致下载失败
XBodhi. 2019-09-21
  • 打赏
  • 举报
回复
是不是版本的问题。
LvBao_117 2019-09-20
  • 打赏
  • 举报
回复
引用 6 楼 胖叔叔写代码 的回复:
[quote=引用 5 楼 -一个大坑 的回复:]
知道,不过那个都过了一天了应该没人回复了


你为啥要等人回复呢?
你知道sp1234有很多小号是为什么吗[/quote]小号是什么?
stherix 2019-09-20
  • 打赏
  • 举报
回复
是这样的 每个不同的WorkBook的Style不能共用 因为CellStyle是要存储到具体的文件中的 具体NPOI为什么要这么实现我也搞不懂 没必要在构造函数里弄不同的工作簿名,但是可能需要针对每一个工作簿弄一个字典存放这些Style实例
  • 打赏
  • 举报
回复
引用 5 楼 -一个大坑 的回复:
知道,不过那个都过了一天了应该没人回复了
你为啥要等人回复呢? 你知道sp1234有很多小号是为什么吗
-一个大坑 2019-09-20
  • 打赏
  • 举报
回复
引用 3 楼 胖叔叔写代码 的回复:
…………你只需要等人回复就可以继续回复了
知道,不过那个都过了一天了应该没人回复了 我现在改成public ExcelStyle(XSSFWorkbook fileWorkbook)这样了,不过感觉好像不是很好
果然C 2019-09-20
  • 打赏
  • 举报
回复
只能回复3次是只能连续回复,不是总次数
  • 打赏
  • 举报
回复
…………你只需要等人回复就可以继续回复了
-一个大坑 2019-09-20
  • 打赏
  • 举报
回复
这个是我定义的样式类

public sealed class ExcelStyle
    {
        public ICellStyle CellStyle { get; set; }
        public ICellStyle CellHeadStyle { get; set; } 
        public ICellStyle CellStringStyle { get; set; }
        public ICellStyle CellIntStyle { get; set; }
        public ICellStyle CellNumberStyle { get; set; }
        public ICellStyle CellDateStyle { get; set; }
        public ICellStyle CellTimeStyle { get; set; }

        public ExcelStyle()
        {
            XSSFWorkbook fileWorkbook = new XSSFWorkbook();

            //初始单元格样式
            ICellStyle cellStyle = fileWorkbook.CreateCellStyle();
            cellStyle.Alignment = HorizontalAlignment.Center; //左右居中
            cellStyle.VerticalAlignment = VerticalAlignment.Center; //上下居中
            cellStyle.BorderTop = BorderStyle.Thin; //单元格上边框黑色
            cellStyle.BorderBottom = BorderStyle.Thin; //单元格下边框黑色
            cellStyle.BorderLeft = BorderStyle.Thin; //单元格左边框黑色
            cellStyle.BorderRight = BorderStyle.Thin; //单元格右边框黑色  

            //原始单元格样式
            CellStyle = cellStyle;

            //表头样式            
            IFont headFontStyle = fileWorkbook.CreateFont(); //表头字体样式
            headFontStyle.FontHeightInPoints = 11;//字体大小
            headFontStyle.Boldweight = 700; //字体加粗
            headFontStyle.Color = 9;  //字体颜色            
            CellHeadStyle = cellStyle;
            CellHeadStyle.SetFont(headFontStyle); //将字体样式赋给样式对象
            CellHeadStyle.FillPattern = FillPattern.SolidForeground;
            CellHeadStyle.FillForegroundColor = 0;
            ((XSSFColor)CellHeadStyle.FillForegroundColorColor).SetRgb(new byte[] { 51, 102, 255 });
            CellHeadStyle.IsLocked = true;
            CellHeadStyle.WrapText = true;

            //stringStyle
            CellStringStyle = cellStyle;
            CellStringStyle.WrapText = false;
            CellStringStyle.IsLocked = false;
            CellStringStyle.Alignment = HorizontalAlignment.Left;

            //intStyle
            CellIntStyle = cellStyle;
            CellIntStyle.Alignment = HorizontalAlignment.Right;
            CellIntStyle.IsLocked = false;
            CellIntStyle.DataFormat = fileWorkbook.CreateDataFormat().GetFormat("0");

            //numberStyle
            CellNumberStyle = cellStyle;
            CellNumberStyle.Alignment = HorizontalAlignment.Right;
            CellNumberStyle.IsLocked = false;
            CellNumberStyle.DataFormat = fileWorkbook.CreateDataFormat().GetFormat("#,##0.00");

            //dateStyle
            CellDateStyle = cellStyle;
            CellDateStyle.DataFormat = fileWorkbook.CreateDataFormat().GetFormat("yyyy-mm-dd");
        }
    }
-一个大坑 2019-09-20
  • 打赏
  • 举报
回复
This Style does not belong to the supplied Workbook Stlyes Source. Are you trying to assign a style from one workbook to the cell of a differnt workbook? 我把Excel的样式定义了一个类(excelStyle)出来,然后cell.CellStyle = excelStyle.CellHeadStyle;这样给单元格设置样式报错了 是因为他们都是 new XSSFWorkbook();不是同一个导致的吗 我想把样式在一个地方先定义好,其余导出excel的方法直接用,如果每个方法都定义,npoiHelper类写的好长,大部分代码都是样式的代码,而且如果要改样式,几个方法都要改也麻烦
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据到EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据到EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧