ITextSharp表格过长自动换页怎么在每一页自动加表头

ITextSharp表格过长自动换页怎么在每一页自动加表头,第1张

将要设置成表头的行设置成“在各页顶端以标题行形式重复出现”即可。

设置方法如下:

选中要设置成表头的行,鼠标右键“表格属性”,在“行”窗口,将“在各页顶端以标题行形式重复出现”打勾,确定即可。

net生成pdf表头

项目需要在线生成PDF文件,我首先考虑采用itextsharp控件来实现。具体方法参考 https://sourceforge.net/projects/itextsharp/

1.首先利用nuget 引入该控件包。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/2626f9837f6e050e0abfa4fe62dc720c.png#pic_center)

2、然后直接创建就可以了。

using iTextSharp.text

using iTextSharp.text.pdf

using System

using System.Collections.Generic

using System.Data

using System.IO

using System.Linq

using System.Text

using System.Web

public class CreatePDF

{

private static CreatePDF instance

public static CreatePDF GetInstance()

{

if (instance == null)

{

instance = new CreatePDF()

}

return instance

}

private static Document doc

//string fontdb = AppDomain.CurrentDomain.BaseDirectory + "Template\\msyh.ttc"

//private static BaseFont bf = BaseFont.CreateFont(@"C://Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED)

static string fontdb = (AppDomain.CurrentDomain.BaseDirectory + "Template\\msyh.ttf").Replace("\\", "/")

private static BaseFont bf = BaseFont.CreateFont(fontdb + "", BaseFont.IDENTITY_H, BaseFont.EMBEDDED)

//四种字体

private static Font fontBig = new Font(bf, 14, Font.BOLD)

private static Font fontSmall = new Font(bf, (float)10.5, Font.BOLD)

private static Font fontSmallNoBold = new Font(bf, (float)10.5)

private static float IndentationLeft = 50//距左边距

//如果要传参数进来,可自定义

public string GeneratePDF(string name)

{

doc = new Document(PageSize.A4)

string filePath = string.Empty

try

{

//MemoryStream ms2 = new MemoryStream()

string fileName = string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddHHmmss"))

filePath = AppDomain.CurrentDomain.BaseDirectory + "Template\\" + fileName

FileStream fs = new FileStream(filePath, FileMode.Create)//创建临时文件,到时生成好后删除

PdfWriter writer = PdfWriter.GetInstance(doc, fs)

writer.CloseStream = false//把doc内容写入流中

doc.Open()

//核心 *** 作

CreateLine(name)//生成一条下横线

#region 添加水印

string waterMarkName = "机密"

#endregion

doc.Close()

MemoryStream ms = new MemoryStream()

if (fs != null)

{

byte[] bytes = new byte[fs.Length]//定义一个长度为fs长度的字节数组

fs.Read(bytes, 0, (int)fs.Length)//把fs的内容读到字节数组中

ms.Write(bytes, 0, bytes.Length)//把字节内容读到流中

fs.Flush()

fs.Close()

}

MemoryStream waterMS = SetWaterMark(ms, filePath, waterMarkName)//先生成水印,再删除临时文件

//if (File.Exists(filePath))//判断临时文件是否存在,如果存在则删除

//{

//File.Delete(filePath)

//GC.Collect()//回收垃圾

//}

//SendFile(fileName, waterMS)//把PDF文件发送回浏览器

}

catch (DocumentException ex)

{

throw new Exception(ex.Message)

}

return filePath

}

#region 生成一条横线

private static void CreateLine(string name)

{

PdfPTable table = new PdfPTable(1)//一个单元格的

PdfPCell cell = new PdfPCell()

Image gif = Image.GetInstance(AppDomain.CurrentDomain.BaseDirectory + "Template\\logo.png")

gif.ScaleAbsoluteWidth(100)

cell.AddElement(gif)

cell.BorderWidth = 0f

cell.BorderWidthBottom = 0.2f

table.AddCell(cell)

doc.Add(table)

}

#endregion

#region 生成页码

private static void AddPageNumberContent()

{

var content = new Paragraph("共 页 第 页", fontSmall)

content.IndentationRight = IndentationLeft + 20

content.Alignment = 2 //居左

doc.Add(content)

}

#endregion

#region 生成单元格

private static PdfPCell GetPdfCell(string content, Font font, int horizontalAlignment)

{

Paragraph paragraph = new Paragraph(content, font)

paragraph.FirstLineIndent = 2

paragraph.SetLeading(10, 20)

paragraph.SpacingAfter = 10

PdfPCell cell = new PdfPCell(paragraph)

cell.HorizontalAlignment = horizontalAlignment//水平位置

cell.VerticalAlignment = Element.ALIGN_CENTER//垂直居中

cell.MinimumHeight = 20//单元格的最小高度

cell.Border = 0

return cell

}

#endregion

#region 生成水印

private static MemoryStream SetWaterMark(MemoryStream ms, string filePath, string waterMarkName, string waterMarkAddr = null)

{

MemoryStream msWater = new MemoryStream()

PdfReader pdfReader = null

PdfStamper pdfStamper = null

try

{

pdfReader = new PdfReader(filePath)

pdfStamper = new PdfStamper(pdfReader, msWater)

int total = pdfReader.NumberOfPages + 1//获取PDF的总页数

iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1)//获取第一页

float width = psize.Width//PDF页面的宽度,用于计算水印倾斜

float height = psize.Height

PdfContentByte waterContent

BaseFont basefont = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED)

PdfGState gs = new PdfGState()

for (int i = 1i <totali++)

{

waterContent = pdfStamper.GetOverContent(i)//在内容上方加水印

//透明度

waterContent.SetGState(gs)

//开始写入文本

waterContent.BeginText()

waterContent.SetColorFill(BaseColor.RED)

waterContent.SetFontAndSize(basefont, 18)

waterContent.SetTextMatrix(0, 0)

if (waterMarkAddr == null || waterMarkAddr == "")

{

waterContent.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, width / 2, height / 2, 55)

}

else

{

waterContent.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, width / 2, height / 2 + 100, 55)

waterContent.ShowTextAligned(Element.ALIGN_CENTER, waterMarkAddr, width / 2, height / 2 - 100, 55)

}

waterContent.EndText()

}

}

catch (Exception)

{

return ms

}

finally

{

if (pdfStamper != null)

pdfStamper.Close()

if (pdfReader != null)

pdfReader.Close()

}

return msWater

}

#endregion

//-----------------------发送PDF文件回浏览器端----------------------

public static void SendFile(string fileName, MemoryStream ms, Encoding encoding = null)

{

fileName = (fileName + "").Replace(" ", "")

encoding = encoding ?? Encoding.UTF8

if (ms != null &&!string.IsNullOrEmpty(fileName))

{

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response

response.Clear()

response.Charset = encoding.BodyName// "utf-8"

if (!HttpContext.Current.Request.UserAgent.Contains("Firefox") &&!HttpContext.Current.Request.UserAgent.Contains("Chrome"))

{

fileName = HttpUtility.UrlEncode(fileName, encoding)

}

response.AddHeader("Content-Disposition", "attachmentfilename=" + fileName)

//为了解决打开,导出NPOI生成的xlsx文件时,提示发现不可读取内容。

if (!(fileName + "").ToLower().EndsWith(".xlsx"))

{

response.AddHeader("Content-Type", "application/octet-stream")

response.BinaryWrite(ms.GetBuffer())

}

else

{

response.BinaryWrite(ms.ToArray())

}

ms.Close()

ms = null

response.Flush()

response.End()

}

}

}

登录后复制

特别需要注意一点的是,如果对字体有特殊要求,可以将字库文件放在项目目录下,但字库的文件类型不同,引用时略有差别。

1.Excle神器NPOI

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。NPOI让.NET平台拥有了一个比较完善的读写Excel的工具。使用量非常广泛,应该是开源的.NET Excel读写工具中曝光度最高的一个吧,没有之一。

使用NPOI的优势有:完全免费使用,包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等),支持处理的文件格式包括xls, xlsx, docx.采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间),同时支持文件的导入和导出,你不需要在服务器上安装微软的Office,可以避免版权问题。使用起来比Office PIA的API更加方便,更人性化。那么还等什么呢?下面就是我第一次使用NPOI做的一个日报表工具,里面的单元格合并都是在程序中动态完成的,过程很艰辛,但结果很美好,目前已经使用了2年,稳定无bug,非常给力啊。

官方网站:http://npoi.codeplex.com/

https://github.com/tonyqus/npoi

官方教程:http://www.npoi.info/

2.NPOI扩展—NPOI.CSS

NPOI.CSS是一个可以在使用NPOI时用类CSS的方法设置单元格样式的NPOI扩展,只支持.NET4及以上版本的项目。这个扩展是为了方便在使用的时候设置单元格及其相关格式样式,可以使用类似Css的方式,非常给力。看看下面的代码:

1

cell.CSS("color:redfont-weight:boldfont-size:11font-name:宋体border-type:thin")

官方网站:https://github.com/qihangnet/npoi.css

3.yjinglee.office

yjinglee.office用于.Net平台下的Excel *** 作,主要封装NPOI对外提供更简单实用的API,提供以下功能点:

1.读取Excel数据转换成对象集合

2.写入集合到Excel,并提供可以Excel样式定义

看看一段读取Excel的代码:

1

2

3

4

5

6

7

8

9

10

var Reports = new Collection()

for (var i = 0i <10i++)

{

Reports.Add(new Report {Id = i*100, Name = Guid.NewGuid().ToString()})

}

var excel = new Excel(new DefaultStyle())//创建Excel实例,可以传递不同的样式实例

excel.CreateSheet("Test")//创建一个Sheet,命名为Test

excel.WriteObject(Reports, 0, 0)//在Sheet0中的第0行写入集合

excel.SetColumnWidth(0, 0, new [] {5, 35})//在Sheet0的第0列开始依次设置列宽

excel.WriteFile(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "demo.xlsx"))//保存文件

4.ExcelReport报表引擎

ExcelReport是一款基于NPOI开发的报表引擎组件。它基于关注点分离的理念,将数据与样式、格式分离。让模板承载样式、格式等NPOI不怎么擅长且实现繁琐的信息,结合NPOI对数据的处理的优点将Excel报表的生成化繁为简。同时,对报表组成的基本元素进行了抽象,进一步简化了Excel报表的生成过程。

官方网站:https://github.com/hanzhaoxin/ExcelReport

介绍文章:http://www.cnblogs.com/hanzhaoxin/p/4472860.html

5.Epplus

Epplus是一个使用Open Office XML(Xlsx)文件格式,读写Excel 2007/2010文件的开源组件。和NPOI相比,它更早的支持了Xlsx格式,而NPOI支持Excel 2003更好,现在新版本的NPOI也开始支持Xlsx了。所以他们两个还是有一点区别的。Epplus我没用过,但很早就听说了,也是使用非常官方的一个,目前也一直在更新。看大家的使用需求了。可以尝试一下。支持的范围也很广,例如:单元格合并,单元格样式,图表(这个NPOI目前还不是很好),表格,数据验证,公式,VBA等等。

官方网站:http://epplus.codeplex.com/

6.LinqToExcel

LinqToExcel是一个.NET平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格。类型之前的LINQToXXX如果你是LINQ语法糖爱好者那最适合你。例如,下面代码,查询电子表格的头:

1

2

3

4

var excel = new ExcelQueryFactory("excelFileName")

var indianaCompanies = from c in excel.Worksheet<Company>()

where c.State == "IN"

select c

官方网站:https://github.com/paulyoder/

7.NetOffice组件

NetOffice组件比较特别,是一个 *** 作Office的强大组件,包括处理Office, Excel, Word, Outlook, PowerPoint, Access, Project, Visio等,所以支持非常全面。但是这个组件并不是完全单独写的,而是调用Microsoft Office的互 *** 作程序集以及VSTO,也就是进行了一个深度的封装,从而让你不需要安装这些东西,只需要拷贝相应的程序集就可以了。目前一共包括16个 *** 作的程序集。根据你的需要可以选择相应的程序集。它有几个优点:

1.没有Office的版本限制;

2.支持Office2000,2003,2007,2010,2013版本,就是支持全部Office的版本,足够强大;

3.支持版本之间的独立开发

4. *** 作语法和Microsoft的互 *** 作程序集的语法是一样的;因此更加易于学习和使用

5.如果你熟悉Office对象模型,你可以使用你现有的PIA代码,不需要重新学习

6.优化了一些COM *** 作的代码

7.可以在.NET2.0及以上环境使用;

8.部署方便,不需要注册,没有依赖的程序集

其他的功能看官方文件介绍,如果有空,大家对这个需求强烈,可以写文章专门介绍。

官方网站:http://netoffice.codeplex.com/

8.Word文档读写工具Docx

DocX是一个以非常直观简单的方式 *** 作Word 2007/2010文件的轻量级.NET组件。它的速度非常快,而且不需要安装微软的Office软件。在中国,免费并且小巧的WPS有足够的理由让很多用户放弃庞大的Office,那在实际软件开发过程中,这玩意就有用处了。遗憾是不支持2003,但总归是被淘汰的趋势,而且用WPS,也没有啥版本的区别。目前支持在文件中插入、删除和替代文本,支持所有的文本格式,如字体,下划线,高亮等支持插入图片、超链接、表格、页眉页脚以及自定义属性等支持类似JQuery的链式写法,很方便编程开发。

相比Excel来说,开源的 *** 作Doc文档的组件比较少,这个组件只能勉强满足一些基本功能吧。遇到一些高级的,坑还是很多。但总的来说,常规支持是第一步吧,该项目目前也在更新中,期待更加完善。我在2013年曾经写过一篇介绍基本使用的文章:【原创】开源Word读写组件DocX介绍与入门

官方网站:http://docx.codeplex.com/

9.PDF处理组件PDFsharp

生成PDF文件格式的文档,大家肯定有想过,很多人项目中也肯定用过,方法、组件肯定有很多。但是.NET平台开源免费的不多,最好用的应该是ItextPDF,不过人家是非商业免费,所以我们就排除在外吧。看看免费的,这个PDFSharp是目前比较完善,而且还在持续更新的。支持功能有:

可以使用.NET编程语言动态创建PDF文档,

很容易使用对象模型来构建文档,

全部用C#重写设计和编写代码,

可以生成PDF文件和显示在窗体或者打印,

使用同一源文件,可以修改、合并或者分割PDF文件,

可以控制图片的透明度,嵌入了字体等等。支持总体算全面吧,不过没有亲自测试过。

官方网站:http://www.pdfsharp.net/

10.MigraDoc文档生成器

MigraDoc是一个.NET平台开源的文档生成器,几乎支持所有的文字处理功能。你只需要添加段落,表格,或者图表到节中,使用书签来创建链接,表格内容,索引等等。MigraDoc会自动进行分页和布局,可以生成PDF,XPS以及RTF文档格式。总的来说,是一个更简单类型的通用文档生成工具。它的官方网站和PDFsharp是一起的,目前也是在更新中。

官方网站:http://www.pdfsharp.net/

11.PdfReport报表工具

PdfReport 是一个支持code-first的报表引擎,建立在开源项目iTextSharp和 EPPlus基础上。支持.net 3.5以上,看看项目的一个图片:

官方网站:http://pdfreport.codeplex.com/

12.文件差异比较diffplex

diffplex是一个开源的C#文本差异比较软件。支持.NET 4.0, Silverlight 5.0, Windows 8.0, Windows Phone 8.0, Windows Phone Appx 8.1等环境。如下图所示:

官方网站:https://github.com/mmanela/diffplex

13.ReportGenerator

ReportGenerator可以将OpenCover, PartCover, Visual Studio 或者NCover生成的XML报表转换为可读性更加好的格式。上面这几个工具都是代码覆盖率分析工具。转换后的报表有以下格式:

1.HTML, HTMLSummary

2.XML, XMLSummary

3.Latex, LatexSummary

4.TextSummary

5.Custom reports

该组件目前一直在持续进行更新,对于专门做测试方面的人应该有些帮助,曾经也看到过文章使用这个组件来展示分析后的报表,不过不太懂,不去深究。

  官方网站:https://github.com/danielpalme/ReportGenerator

14.BusyReports

BusyReports是一个非常方便的从SSRS Web 服务生成报表的应用程序。BusyReports提供了一个GUI界面,可以方便配置报表参数,电子邮件,文件路径等。这些配置信息存储在4个易于编辑的表格中。该组件与SQL Server数据驱动订阅类似,但删除了其中一些限制。该组件目前一直在更新。看下面的 GUI 配置界面:

官方网站:http://busyreports.codeplex.com/

15.Seal Report

Seal Report应该是上面这几个之中最好用,最常用的一个。它提供了一个完整的从其他任何数据库产生报表的架构。该产品主要关注于容易安装和报表设计,一旦安装好,报表很快就可以建立并且发布。该组件完全开源,使用C#语言编写。其主要特征有,1.动态SQL数据源:可以使用SQL或让Seal引擎构建动态SQL用于查询数据库,2.本地数据透视表:直接在数据透视表简单的拖放元素,并将它们显示在报表中,还支持HTML5图表等,详细去官网看看,下面看2张报表设计和报表结果的截图:

报表结果:

官方网站:http://sealreport.codeplex.com/


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11464568.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存