用ITextSharp将GridView的内容导出到PDF时,如何能够让列根据数据来自动调整列宽?

badegghyt 2008-07-29 04:52:42
用ITextSharp已实现将GridView的内容导出到PDF,唯一美中不足的是输出的PDF的列宽变得都一致了。想做到生成的PDF能够自动根据数据长度来调整列宽(就像Excel里的“最适合列宽”,可是不知道如何实现。结果与代码奉上,希望高人指点一下,谢谢!

【先看结果】
http://badegghyt.sv12.fsdotnet.net/eggcjs/Other/GridViewToPDF/GridViewToPDF.html

【共通类】

using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Web.UI.WebControls; // GridView
using System; // String
using System.Web; // HttpContext
using System.Web.UI;
using System.Text;
//using System.Drawing;

namespace EggAspNetStudy.Common
{
/// <summary>
/// 将DataTable转化为PDF文件的方法
/// </summary>
public class GrdToPDF
{
public GrdToPDF()
{
}

#region ConvertGrdiViewToPDF_EachPageHeader() -> 换GridView为PDF文档,每一页都有表头

/// <summary>
/// 转换GridView为PDF文档
/// </summary>
/// <param name="pobjGrdv">GridView</param>
/// <param name="PDFFileName">目标PDF文件名字</param>
/// <param name="FontPath">字体所在路径</param>
/// <param name="FontSize">字体大小</param>
/// <returns>返回调用是否成功</returns>
public static void ConvertGrdiViewToPDF_EachPageHeader(GridView pobjGrdv, string PDFFileName, string FontPath, float FontSize)
{
//string strFileName = PDFFileName + "_" + DateTime.Now.ToString("yyyyMMddHmmss") + ".pdf";
string strFileName = PDFFileName + ".pdf";

//初始化一个目标文档类
//Document document = new Document();
//竖排模式,大小为A4,四周边距均为25
Document document = new Document(PageSize.A4, 25, 25, 25, 25);
//横排模式,大小为A4,四周边距均为50
//Document doc = new Document(PageSize.A4.rotate(),50,50,50,50);

//调用PDF的写入方法流
//注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(HttpContext.Current.Server.MapPath(strFileName), FileMode.Create));

//创建PDF文档中的字体
BaseFont baseFont = BaseFont.CreateFont(
FontPath,
BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);

//根据字体路径和字体大小属性创建字体
Font font = new Font(baseFont, FontSize);

// 添加页脚
//HeaderFooter footer = new HeaderFooter(new Phrase(footertxt), true);
HeaderFooter footer = new HeaderFooter(new Phrase("-- ", font), new Phrase(" --", font));
footer.Border = Rectangle.NO_BORDER; // 不显示两条横线
footer.Alignment = Rectangle.ALIGN_CENTER; // 让页码居中
document.Footer = footer;

//打开目标文档对象
document.Open();

//根据数据表内容创建一个PDF格式的表
PdfPTable table = new PdfPTable(pobjGrdv.Columns.Count);
//iTextSharp.text.Table table = new iTextSharp.text.Table(pobjGrdv.Columns.Count);

// GridView的所有数据全输出
pobjGrdv.AllowPaging = false;

// ---------------------------------------------------------------------------
// 添加表头
// ---------------------------------------------------------------------------
// 设置表头背景色
//table.DefaultCell.BackgroundColor = Color.GRAY; // OK
//table.DefaultCell.BackgroundColor = (iTextSharp.text.Color)System.Drawing.Color.FromName("#3399FF"); // NG
table.DefaultCell.BackgroundColor = iTextSharp.text.Color.LIGHT_GRAY;

//table.DefaultCell.BackgroundColor = System.Drawing.Color.DodgerBlue;
// 添加表头
for (int j = 0; j < pobjGrdv.Columns.Count; j++)
{
table.AddCell(new Phrase(pobjGrdv.HeaderRow.Cells[j].Text, font)); // OK
}

// 告诉程序这行是表头,这样页数大于1时程序会自动为你加上表头。
table.HeaderRows = 1;

// ---------------------------------------------------------------------------
// 添加数据
// ---------------------------------------------------------------------------
// 设置表体背景色
table.DefaultCell.BackgroundColor = Color.WHITE;
//遍历原gridview的数据行
for (int i = 0; i < pobjGrdv.Rows.Count; i++)
{
for (int j = 0; j < pobjGrdv.Columns.Count; j++)
{
table.AddCell(new Phrase(pobjGrdv.Rows[i].Cells[j].Text, font));
}
}

//在目标文档中添加转化后的表数据
document.Add(table);

//关闭目标文件
document.Close();

//关闭写入流
writer.Close();

// Dialog
String FullFileName = System.Web.HttpContext.Current.Server.MapPath(strFileName);//这里是你文件在项目中的位置,根目录下就这么写
FileInfo DownloadFile = new FileInfo(FullFileName);
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ClearHeaders();
System.Web.HttpContext.Current.Response.Buffer = false;
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.End();
}

//然后,在要调用转换的按钮的事件代码中调用就可以了
//假设传进去的GridView的名字为GridView1
//假设要保存的文件名为GridView的ID
//假设字体使用simsun (请注意根据你电脑的实际情况来选择目录)
//假设字号选择14
//GrdToPDF.ConvertGrdiViewToPDF_EachPageHeader(this.GridView1, this.GridView1.ID.ToString(), "c:\\winnt\\FONTS\\simsun.ttc,1", 14);

#endregion

}
}


...全文
2581 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
默默家的猪 2012-08-16
  • 打赏
  • 举报
回复
楼主.问个问题...我是直接导出整个ASP.NET的页面.
可如果超出PDF页面长度的部分就显示不了...
怎么自动再生成新页来展示没显示出来的数据??
有什么属性和方法???
miaojunna 2012-03-08
  • 打赏
  • 举报
回复
请问楼主,你那里导pdf时,如果数据量很大,比如达到70000条,你导出的时候有问题吗?
LiuMengLing88 2011-11-23
  • 打赏
  • 举报
回复
挺好的,有用!
yifansdut 2011-07-31
  • 打赏
  • 举报
回复
可手动设置每列的相对列宽
方法如下:
假设共有9列,在GrdToPDF.cs中插入
int[] widths = { 5, 6, 9, 10, 13, 13, 13, 15, 6 }; // wsq 每列的相对宽度
table.SetWidths(widths); // wsq 每列的相对宽度
apple_008 2010-08-06
  • 打赏
  • 举报
回复
我刚刚要做一个这样的功能,找了很久了,终于有点接近了,无尽感谢
wenchang4you 2010-05-21
  • 打赏
  • 举报
回复
真的太完美了,我又改了一下,加上页眉和页脚
jiayibest 2010-02-14
  • 打赏
  • 举报
回复
你是我偶像啊!!!老师刚好要做个完全一样的东西!
向你学习!
HQvsIT 2009-07-28
  • 打赏
  • 举报
回复
谢了,正好需要学这方面的.
希望你还能多提高这方面的知识,谢咯!
HalloMoto 2009-03-31
  • 打赏
  • 举报
回复
呵..谢谢了.
很有参考价值
QQ415822013 2008-12-29
  • 打赏
  • 举报
回复
终于找到近的了,好好学习了!谢谢
bugfoxlmc 2008-08-21
  • 打赏
  • 举报
回复
顶...........
正好要做个PDF转换,太感谢了.
badegghyt 2008-07-30
  • 打赏
  • 举报
回复
顺便把SQL语句奉上,方便想调试的人调试,呵呵


CREATE TABLE KOUT_EXTBL_USERS
(
項番 NUMBER,
名前 VARCHAR2(30),
性別 CHAR(2),
年齢 NUMBER,
電話番号 VARCHAR2(30),
メールアドレス VARCHAR2(50),
住所 VARCHAR2(100),
更新日時 DATE DEFAULT sysdate
)
PCTFREE 10
MAXTRANS 255
TABLESPACE OTC_DTA
STORAGE(INITIAL 64K MINEXTENTS 1 MAXEXTENTS 2147483645 BUFFER_POOL DEFAULT)
NOCACHE
LOGGING
/
INSERT INTO KOUT_EXTBL_USERS values('1','ユーザーA','男','25','080-1111-1001',
'testuser01@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('2','ユーザーB','女','20','080-1111-1002',
'testuser02@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('3','ユーザーC','男','26','080-1111-1003',
'testuser03@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('4','ユーザーD','女','25','080-1111-1004',
'testuser04@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('5','ユーザーE','女','17','080-1111-1005',
'testuser05@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('6','ユーザーF','男','26','080-1111-1006',
'testuser06@hotmail.co.jp','東京都中央区八丁堀',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('7','ユーザーG','男','25','080-1111-1007',
'testuser07@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('8','ユーザーH','女','23','080-1111-1008',
'testuser08@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('9','ユーザーI','男','26','080-1111-1009',
'testuser09@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('10','ユーザーJ','女','18','080-1111-1010',
'testuser10@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('11','ユーザーK','女','23','080-1111-1011',
'testuser11@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('12','ユーザーL','男','26','080-1111-1012',
'testuser12@hotmail.co.jp','東京都中央区八丁堀',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('13','ユーザーM','女','25','080-1111-1013',
'testuser13@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('14','ユーザーN','女','30','080-1111-1014',
'testuser14@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('15','ユーザーO','男','26','080-1111-1015',
'testuser15@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('16','ユーザーP','男','25','080-1111-1016',
'testuser16@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('17','ユーザーQ','女','23','080-1111-1017',
'testuser17@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('18','ユーザーR','男','35','080-1111-1018',
'testuser18@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('19','ユーザーS','女','25','080-1111-1019',
'testuser19@yahoo.co.jp','東京都文京区茗荷谷',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('20','ユーザーT','女','23','080-1111-1020',
'testuser20@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('21','ユーザーU','男','26','080-1111-1021',
'testuser21@hotmail.co.jp','東京都中央区八丁堀',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('22','ユーザーV','男','33','080-1111-1022',
'testuser22@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('23','ユーザーW','男','50','080-1111-1023',
'testuser23@yahoo.co.jp','東京都中央区八丁堀',to_date('2008/07/28 15:27:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('24','ユーザーX','女','23','080-1111-1024',
'testuser24@yahoo.co.jp','東京都新宿区大久保',to_date('2008/07/28 15:28:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('25','ユーザーY','男','45','080-1111-1025',
'testuser25@hotmail.co.jp','東京都中央区八丁堀',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/
INSERT INTO KOUT_EXTBL_USERS values('26','ユーザーZ','女','26','080-1111-1026',
'testuser26@hotmail.co.jp','東京都墨田区押上',to_date('2008/07/29 15:29:00', 'yyyy/MM/dd hh24:mi:ss')
)
/


另外试一下插入超链接,试试,别砸我呀,呵呵
http://badegghyt.sv12.fsdotnet.net/eggcjs/Other/GridViewToPDF/GridViewToPDF.html
badegghyt 2008-07-30
  • 打赏
  • 举报
回复
不是吧? 没人回? 是没人气还是被这些代码给吓怕了? 下次还是不贴代码可能更好一点吧。。。
badegghyt 2008-07-29
  • 打赏
  • 举报
回复
【前台aspx页面】

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test04_GrdToPDFUseComm.aspx.cs" Inherits="themes_01_GridViewExportToPDF_test04_GrdToPDFUseComm" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>無題のページ</title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="PDF出力" />

<asp:SqlDataSource ID="DataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
ProviderName="<%$ ConnectionStrings:connStrMaximT6.ProviderName %>"
SelectCommand="
SELECT
項番
,名前
,性別
,年齢
,電話番号
,メールアドレス
,住所
FROM
KOUT_EXTBL_USERS
ORDER BY
項番 ASC
">
</asp:SqlDataSource>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="DataSource1" EnableViewState="False"
AllowPaging="True" DataKeyNames="項番" CellPadding="4" ForeColor="#333333" GridLines="Both">


<Columns>

<asp:BoundField DataField="項番" HeaderText="項番" ReadOnly="True" SortExpression="項番" />
<asp:BoundField DataField="名前" HeaderText="名前" ReadOnly="True" SortExpression="名前" />
<asp:BoundField DataField="性別" HeaderText="性別" ReadOnly="True" SortExpression="性別" />
<asp:BoundField DataField="年齢" HeaderText="年齢" ReadOnly="True" SortExpression="年齢" />
<asp:BoundField DataField="電話番号" HeaderText="電話番号" ReadOnly="True" SortExpression="電話番号" />
<asp:BoundField DataField="メールアドレス" HeaderText="メールアドレス" ReadOnly="True" SortExpression="メールアドレス" />
<asp:BoundField DataField="住所" HeaderText="住所" ReadOnly="True" SortExpression="住所" />

</Columns>

<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
<EditRowStyle BackColor=Pink />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Left" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />

</asp:GridView>
</div>
</form>
</body>
</html>



【后台CS代码】

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using EggAspNetStudy.Common;
using iTextSharp.text;

public partial class themes_01_GridViewExportToPDF_test04_GrdToPDFUseComm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
try
{
GrdToPDF.ConvertGrdiViewToPDF_EachPageHeader(this.GridView1, this.GridView1.ID.ToString(), "c:\\winnt\\FONTS\\simsun.ttc,1", 14);
}
catch (DocumentException de)
{
Response.Write(de.ToString());
}
}
}

62,047

社区成员

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

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

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

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