OpenXmlSdk导出Excel_weixin_30260399的博客-程序员宅基地

  感觉OpenXmlSdk的语法真的不是很友好。研究了半天,只实现了简单的导出功能。对于单元格样式的设置暂时还是搞明白,网上的资料真的很少,官方文档是英文的。中文的文章大都是用工具(Open XML SDK 2.0 Productivity Tool)搞出来的,反正在我这是不管用。最终还是回到了NPOI 的怀抱。

  最后还是把这点代码记录一下,以后有时间再继续研究吧。

 

  1 using System;
  2 using System.Data;
  3 using System.IO;
  4 using System.Web;
  5 using DocumentFormat.OpenXml;
  6 using DocumentFormat.OpenXml.Packaging;
  7 using DocumentFormat.OpenXml.Spreadsheet;
  8 
  9 public static class ExportHelper
 10 {
 11     /// <summary>
 12     /// 导出Excel文件
 13     /// </summary>
 14     /// <param name="fileName"></param>
 15     /// <param name="dataSet">DataSet中每个DataTable生成一个Sheet</param>
 16     public static void ExportExcel(string fileName, DataSet dataSet)
 17     {
 18         if (dataSet.Tables.Count == 0)
 19         {
 20             return;
 21         }
 22 
 23         using (MemoryStream stream = DataTable2ExcelStream(dataSet))
 24         {
 25             FileStream fs = new FileStream(fileName, FileMode.CreateNew);
 26             stream.WriteTo(fs);
 27             fs.Flush();
 28             fs.Close();
 29         }
 30     }
 31 
 32     public static void ExportExcel(string fileName, DataTable dataTable)
 33     {
 34         DataSet dataSet = new DataSet();
 35         dataSet.Tables.Add(dataTable);
 36         ExportExcel(fileName, dataSet);
 37     }
 38 
 39     /// <summary>
 40     /// Web导出Excel文件
 41     /// </summary>
 42     /// <param name="fileName"></param>
 43     /// <param name="dataSet">DataSet中每个DataTable生成一个Sheet</param>
 44     public static void ResponseExcel(string fileName, DataSet dataSet)
 45     {
 46         if (dataSet.Tables.Count == 0)
 47         {
 48             return;
 49         }
 50 
 51         using (MemoryStream stream = DataTable2ExcelStream(dataSet))
 52         {
 53             ExportExcel(fileName, stream);
 54         }
 55     }
 56 
 57     public static void ResponseExcel(string fileName, DataTable dataTable)
 58     {
 59         DataSet dataSet = new DataSet();
 60         dataSet.Tables.Add(dataTable.Copy());
 61         ResponseExcel(fileName, dataSet);
 62     }
 63 
 64     private static void ExportExcel(string fileName, MemoryStream stream)
 65     {
 66         HttpContext.Current.Response.Clear();
 67         HttpContext.Current.Response.Charset = "UTF-8";
 68         HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
 69         HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
 70         HttpContext.Current.Response.ContentType = "application/ms-excel";
 71         HttpContext.Current.Response.BinaryWrite(stream.ToArray());
 72         HttpContext.Current.Response.Flush();
 73         HttpContext.Current.Response.End();        
 74     }
 75 
 76     private static MemoryStream DataTable2ExcelStream(DataSet dataSet)
 77     {
 78         MemoryStream stream = new MemoryStream();
 79         SpreadsheetDocument document = SpreadsheetDocument.Create(stream,
 80             SpreadsheetDocumentType.Workbook);
 81 
 82         WorkbookPart workbookPart = document.AddWorkbookPart();
 83         workbookPart.Workbook = new Workbook();
 84 
 85         Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets());
 86 
 87         for (int i = 0; i < dataSet.Tables.Count; i++)
 88         {
 89             DataTable dataTable = dataSet.Tables[i];
 90             WorksheetPart worksheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
 91             worksheetPart.Worksheet = new Worksheet(new SheetData());
 92 
 93             Sheet sheet = new Sheet
 94             {
 95                 Id = document.WorkbookPart.GetIdOfPart(worksheetPart),
 96                 SheetId = (UInt32)(i + 1),
 97                 Name = dataTable.TableName
 98             };
 99             sheets.Append(sheet);
100 
101             SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
102 
103             Row headerRow = CreateHeaderRow(dataTable.Columns);
104             sheetData.Append(headerRow);
105 
106             for (int j = 0; j < dataTable.Rows.Count; j++)
107             {
108                 sheetData.Append(CreateRow(dataTable.Rows[j], j + 2));
109             }
110         }
111 
112         document.Close();
113 
114         return stream;
115     }
116 
117     private static Row CreateHeaderRow(DataColumnCollection columns)
118     {
119         Row header = new Row();
120         for (int i = 0; i < columns.Count; i++)
121         {
122             Cell cell = CreateCell(i + 1, 1, columns[i].ColumnName, CellValues.String);
123             header.Append(cell);
124         }
125         return header;
126     }
127 
128     private static Row CreateRow(DataRow dataRow, int rowIndex)
129     {
130         Row row = new Row();
131         for (int i = 0; i < dataRow.Table.Columns.Count; i++)
132         {
133             Cell cell = CreateCell(i + 1, rowIndex, dataRow[i], GetType(dataRow.Table.Columns[i].DataType));
134             row.Append(cell);
135         }
136         return row;
137     }
138 
139     private static CellValues GetType(Type type)
140     {
141         if (type == typeof(decimal))
142         {
143             return CellValues.Number;
144         }
145         //if ((type == typeof(DateTime)))
146         //{
147         //    return CellValues.Date;
148         //}
149         return CellValues.SharedString;
150     }
151 
152     private static Cell CreateCell(int columnIndex, int rowIndex, object cellValue, CellValues cellValues)
153     {
154         Cell cell = new Cell
155         {
156             CellReference = GetCellReference(columnIndex) + rowIndex,
157             CellValue = new CellValue { Text = cellValue.ToString() },
158             DataType = new EnumValue<CellValues>(cellValues),
159             StyleIndex = 0
160         };
161         return cell;
162     }
163 
164     private static string GetCellReference(int colIndex)
165     {
166         int dividend = colIndex;
167         string columnName = String.Empty;
168 
169         while (dividend > 0)
170         {
171             int modifier = (dividend - 1) % 26;
172             columnName = Convert.ToChar(65 + modifier) + columnName;
173             dividend = (dividend - modifier) / 26;
174         }
175 
176         return columnName;
177     }
178 }

 

转载于:https://www.cnblogs.com/David-Huang/p/4554775.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30260399/article/details/98288754

智能推荐

字符串输入方法_Fly_with_dream的博客-程序员宅基地

当你发现普及组也不简单的时候,已经晚了……我们今天来见证一道大NAN题,可以说是前无古人后无来者。先来讲个故事:从前有一个长度只有八的字符串,他很孤独,体内只有0 和 1,所以他是一个非黑即白的字符串……在他孤独的时间,他有事没事会读《三体》,并学习到了次声波核弹这个概念。他突然意识到,要找到自己体内“1”的个数才能变得强大,像三体一样征服人类……(鬼知道我是怎么想出来的……)然后这就是题目啦,统计一个长度为八的“01”串中“1”的个数。你会发现这似乎很简单,所以看到题目的你就知道这篇博客不会wa

萌新代码审计(一)_LJ会发光的博客-程序员宅基地

由于本大大太菜只能走别人的路了本次审计参照了freebuff的文章实验环境phpstudy+emlog_6.0.0漏洞1(sql注入)在comment.php中可以看到传入了IP可控参数并且调用了delCommentByIp函数,接下来全局搜索delCommentByIp函数,看看这个函数是干啥的。很明显了,接下来我们去测试一下,需要管理员登录。抓包看一下漏洞2(任意文件上传)在plugin.php中可以上传插件,插件格式为zip压缩包,之后会对上传的文件进行解压,这里有问题的哦。

回传值_sunyushen01的博客-程序员宅基地

//回传   huichuan.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String backStr="亲,我是回传值喔";Intent intent=getIntent();intent.putExtra("HUI", backStr);

wget不起作用_haohaounique的博客-程序员宅基地_wget没反应

解决方法:1. 理解NAT,桥接,仅主机 三种模式 参考文章https://blog.csdn.net/zkuncn/article/details/78452098ping各自ip看是否联通 ping外网地址看是否联通2.设置镜像源 下载镜像源文件---&gt;替换 yum clean all yum makecache3.yu...

php去除某个超链接,PHP正则表达式移除超链接文本_weixin_39856607的博客-程序员宅基地

有些时候,我们需要对一些html文本进行处理,比如需要将文本中的超链接内容去除,这个时候就需要用到正则表达式了。比如你可以用$str = preg_replace("/]*href=[^&gt;]*&gt;|[^a]*a[^&gt;]*&gt;/i","",$strhtml); 这段来实现需求,如果想要更多解决方法,可以参看以下的。1、删除内容中的超链接ereg_replace(']*)&gt;(...

物联网应用技术竞赛——android笔记__siyu_的博客-程序员宅基地

Android笔记1.格式化字符串 double a=26.54578; DecimalFormat df = new DecimalFormat("#.00"); //保留小数点后两位 double temp=df.format(a);2.导入摄像头包时需要加以下代码sourceSets { main { jniLibs.srcDirs = ['libs'] }}3.Android透明度android:alpha="0.5"4.android展

随便推点

C语言中qsort()库函数的排序应用_KID怪盗基德1412的博客-程序员宅基地

C语言中不像C++一样有sort(arr.begin(),arr.end(),cmp)排序接口,但是也提供类似的库函数。1. 首先要包含头文件&lt;stdlib.h&gt;2. 对于一维整型数组函数指针定义:int cmp_int(const void *a, const void *b) { int *_a = (int *)a; int *_b = (int *)b; return *_a - *_b;}main函数调用:int main(){

UVA514-Rails_u小鬼的博客-程序员宅基地

UVA514-RailsThere is a famous railway station in PopPush City. Country there is incredibly hilly. The stationwas built in last century. Unfortunately, funds were extremely limited that time. It was possible toestablish only a surface track. Moreover, it

linux 驱动入门 魏清,Linux下的SPI总线驱动(三)_梁航铭的博客-程序员宅基地

版权所有,转载请说明转自原创作者:南京邮电大学 通信与信息系统专业 研二 魏清五.SPI测试代码对于SPI总线驱动,我们可以分为SPI控制设备驱动和SPI接口设备驱动。而作为驱动开发人员主要是像SPI移植的时候一样会添加SPI控制设备和SPI接口设备的私有数据,同时驱动开发人员还需要会开发SPI接口设备驱动,而我们这个SPI测试实验中,我们使用的是内核自带的SPI接口设备驱动代码spidev.c...

Ceph 定制crush map_weixin_33704591的博客-程序员宅基地

定制化crush map简单实验首先,查看原始osd目录树[[email protected] ~]# ceph osd tree# id weight type name up/down reweight-1 3.24 root default-5 1.08 rack rack1-2 1.08...

机器学习-python基础_Pikachu_simple的博客-程序员宅基地

# -*- coding: utf-8 -*-"""Created on Sun Dec 22 10:15:39 [email protected]: zhh"""import math'''1、基本语法'''#同行显示多行语句:用";"分号隔开#print输出:#print默认换行,若要 不换行在变量末尾加上逗号,end=''x='a';y='b'print(x,end='') #...

MySQL系列:性能监控常用4大语句_NIO4444的博客-程序员宅基地

#查看动态指标 show global STATUS; &gt;&gt;MySQL系列:show Global STATUS 用法#查看精通参数 show global variables;&gt;&gt;MySQL系列:show Global VARIABLES 用法#查看连接进程 show full processlist; &gt;&gt;MySQL系列:show full PROCESSLIST 用法#查看同步状态 show slave ST...

推荐文章

热门文章

相关标签