C# c如何将名称列表按字母顺序导出为PDF格式,每页包含多个列
我可能想得太多了。我让校长从他们的学校选择一份学生名单并打印成PDF文档。我从SQL数据库中检索名称并将其写入c中的HTMLTable,然后将此表传递到PDF转换器中。下面的代码将名称写入一个单列表,但可能有1000多个名称,因此我希望代码足够智能,能够在每30个名称之后停止,并开始将名称写入一个新列,每页最多3列。如果列表可以按字母顺序在整个页面上显示,那么这就很容易了,但是我的用户希望名称按字母顺序在页面上显示。下面是我到目前为止所拥有的…如果需要的话,我怎样才能接受这些并创建新的专栏呢C# c如何将名称列表按字母顺序导出为PDF格式,每页包含多个列,c#,tsql,pdf,C#,Tsql,Pdf,我可能想得太多了。我让校长从他们的学校选择一份学生名单并打印成PDF文档。我从SQL数据库中检索名称并将其写入c中的HTMLTable,然后将此表传递到PDF转换器中。下面的代码将名称写入一个单列表,但可能有1000多个名称,因此我希望代码足够智能,能够在每30个名称之后停止,并开始将名称写入一个新列,每页最多3列。如果列表可以按字母顺序在整个页面上显示,那么这就很容易了,但是我的用户希望名称按字母顺序在页面上显示。下面是我到目前为止所拥有的…如果需要的话,我怎样才能接受这些并创建新的专栏呢 H
HtmlGenericControl div = new HtmlGenericControl("div");
HtmlTable tbl = new HtmlTable();
div.Controls.Add(tbl);
tbl.Width = "100%";
HtmlTableRow tr = new HtmlTableRow();
tbl.Rows.Add(tr);
dl = sp.getDemographicLabels(pageID);
HtmlTableCell tc = new HtmlTableCell();
tr.Cells.Add(tc);
tc.InnerText = "Student Name";
tc = new HtmlTableCell();
tr.Cells.Add(tc);
tc.InnerText = "Enrollment Date";
List<dynaTable> ldt = new List<dynaTable>();
ldt = sp.getActiveStudents_Unformatted(pageID);
foreach (dynaTable dt in ldt)
{
tr = new HtmlTableRow();
tbl.Rows.Add(tr);
foreach (dynaTableColumn dtc in dt.dtc)
{
tc = new HtmlTableCell();
tr.Cells.Add(tc);
tc.InnerText = dtc.colValue;
}
}
export dmc = new export();
var sb = new StringBuilder();
div.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
string s = sb.ToString();
dmc.exportPDF("Student Profile", "Portrait", s);
试着跟随
class Program
{
static void Main(string[] args)
{
const int ROWS_PER_PAGE = 30;
const int COLUMNS_PER_PAGE = 3;
List<dynaTable> ldt = new List<dynaTable>();
for(int i = 0; i < 84; i++)
{
ldt.Add(new dynaTable() { name = Encoding.UTF8.GetString(new byte[] {(byte)(i + 0x20)})});
}
var results = ldt.OrderBy(x => x.name).Select((x, i) => new { person = x, index = i })
.GroupBy(x => (int)(x.index / (ROWS_PER_PAGE * COLUMNS_PER_PAGE)))
.Select(x => x.GroupBy(y => y.index % ROWS_PER_PAGE).Select(z => new {
col1 = z == null ? string.Empty : z.FirstOrDefault() == null ? string.Empty : z.FirstOrDefault().person.name,
col2 = z == null ? string.Empty : z.Skip(1).FirstOrDefault() == null ? string.Empty : z.Skip(1).FirstOrDefault().person.name,
col3 = z == null ? string.Empty : z.Skip(2).FirstOrDefault() == null ? string.Empty : z.Skip(2).FirstOrDefault().person.name,
}))
.SelectMany(x => x).ToList();
}
}
public class dynaTable
{
public string name { get; set; }
}
}
我想这会有用的…但我对Linq的了解足够多,当我看到它时就知道了,但不知道如何使用它。我试图这样迭代:foreach var stud in results{tr=new HtmlTableRow;tbl.Rows.Addtr;tc=new HtmlTableCell;tr.Cells.Addtc;tc.InnerText=stud.column1;tc=new HtmlTableCell;tr.Cells.Addtc;tc.InnerText=stud.column2;}但它突出显示了新的{col1=z.First…linq的一部分,并表示未设置为对象?尝试在z上搜索,看看z设置为什么。检查它是否设置为您的第一行或列表的中间。我怀疑问题是当您每页没有90个项目,因此列为空时。我修改了代码以测试是否为空。原来是这样!!现在工作很完美-谢谢非常感谢!!我在正确的轨道上,我也在想同样的事情,并尝试使用String.IsNullorEmpty检查空值,但我一定是做错了什么。不管怎样,再次感谢您帮助一个老家伙解决问题!!我做了更多的测试,发现您不能使用Last,而必须使用skip2。使用Last会产生重复。请参阅更新d代码。