在不同文件中打印报告页面,动态提供文件名

时间:2013-06-18 12:52:00

标签: c# java ms-access reporting

我遇到了报告和打印报告的挑战性要求。要求是:创建一个报告(比方说5页),每个页面应保存在不同的文件中,并通过代码动态提供文件名(使用该页面上的记录ID)。

目前,我尝试使用Access和VBA,我可以获取X页面的报告,但无法将报告的每个页面保存在单独的文件中。我该如何做到这一点?

任何其他技术都可以帮助我实现这一目标 - 也许用C#或Java编程可以帮助我吗?我已经坚持了3天。

由于

我的访问代码和问题:

Private Sub Report_Click()
 Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim MyFilename As String
Dim MyPath As String
Dim temp As String
Set db = CurrentDb
MyPath = "c:\temp\"
Dim stremp As String
stremp = "select distinct(empno) from query2"
Set rs = db.OpenRecordset(stremp)
Do While Not rs.EOF
    temp = rs("Empno")
    MyFilename = rs("EMPNO") & ".PDF"
    DoCmd.OpenReport "FORM", acViewReport, "EMPNO" = " & temp"
    'DoCmd.OpenReport "form", acViewPreview, , "empno", acWindowNormal
    DoCmd.OutputTo acOutputReport, "", acFormatPDF, MyPath & MyFilename
    'do.cmd.outputto
    DoCmd.Close acReport, "FORM"
     DoEvents
    rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
 End Sub

记录集有5条记录,即5页。它打印5次5页,即对于Record1我得到所有5个recrods,Record2 - 所有5个记录&等等。相反,我应该只为Record1创建1,为Record2创建1,依此类推。

任何人都可以帮助我知道我的代码错误/不正确的地方。

由于

2 个答案:

答案 0 :(得分:1)

您可以将任务拆分为:

  1. 将完整报告生成为一个文件

  2. 将报告的每一页存储为不同的文件。

  3. 如果您已完成第一部分,并且您可以将报告存储为pdf文件,则第二部分我可以建议使用iText。它是java库,但也有c#的端口。

    小例子:

        String folder = "/home/user/report/";
        InputStream is = new FileInputStream(folder + "test.pdf");
        PdfReader reader = new PdfReader(is);
    
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            File tmp = new File(folder + "out" + i +".pdf");
            FileOutputStream outStream = new FileOutputStream(tmp);
            Document pdDoc = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(pdDoc, outStream);
            pdDoc.open();
            PdfContentByte cb = writer.getDirectContent();
            PdfImportedPage page = writer.getImportedPage(reader, i);
            pdDoc.newPage();
            cb.addTemplate(page, 0, 0);
            pdDoc.close();
        }
    

答案 1 :(得分:1)

  

您能否告诉我,为什么我的Access代码无法完成这项工作。

这句话有问题:

DoCmd.OpenReport "FORM", acViewReport, "EMPNO" = " & temp"

DoCmd.OpenReport的第三个参数是[FilterName],它是“一个字符串表达式,它是当前数据库中查询的有效名称。”不幸的是,

"EMPNO" = " & temp"

是一个布尔表达式,始终为False,因为两个字符串不相等。我认为你有更多这样的想法:

DoCmd.OpenReport "FORM", acViewReport, , "EMPNO = " & temp

其中第四个参数[WhereCondition]是“一个字符串表达式,它是一个有效的SQL WHERE子句,没有单词WHERE。”