欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2010制作PDF报表

程序员文章站 2024-03-21 14:53:34
...

VS2010制作PDF报表

一、开发环境

  • 编程环境 VS2010
  • 采用pdflib 9.0.0 库

二、基本实现功能

  • 创建一个PDF文件,并在里面绘制表格

三、基本操作步骤

1. 新建一个基于MFC的对话框工程,添加一个按钮

2. PDFlib库的导入

  • 网上下载PDFlib库,任意版本,最好下载一个**版本,一般的都有水印。我这里用的是9.0的。解压PDFlib-9.0.0-MSWin64-C-C++(我的操作系统是64位的),一般包含基本例子和文档,还有pdflib库。
  • 将pdflib.lib、pdflib.h、pdflib.hpp、cpp_wrapped.h、pdflib.dll复制到当前工程目录下,同时加载pdflib.lib库(#pragma comment(lib,”pdflib.lib”))

3. 基本代码实现。参考官网例子

/************************************************************************
*功    能:PDF制作报表
*函 数 名:PDFDrawTable
*参    数:无
*返 回 值:错误状态
*作    者:Ywx
/********************************************************************/
int CPDFTestDlg::PDFDrawTable(void)
{
    try 
     {

        int row, col, font, image, tf=-1, tbl=-1;
        int rowmax=38, colmax=9;
        PDFlib p;
        double llx= 50, lly=50, urx=550, ury=800;
        const wstring headertext =L"xx测试系统数据报告";
        wstring result;
        wostringstream optlist;
        wstring tf_text[] ={
            L"序号",
            L"项目名称",
            L"参数名称",
            L"最大值",
            L"最小值",
            L"量纲",
            L"标准值",
            L"测量值",
            L"结果"};
        p.set_option(L"errorpolicy=return");
        optlist.str(L"");
        p.set_option(optlist.str());

        if (p.begin_document(L"table.pdf", L"") == -1) //打开文档
        {
            wcerr << L"Error: " << p.get_errmsg() << endl;
                return 2;
        }
        p.set_info(L"Creator", L"PDFlib starter sample");
        p.set_info(L"Title", L"table");

    /* -------------------- Add table cells -------------------- */

        /* ---------- Row 1: table header (spans all columns) */
        row = 1; col = 1;
        font = p.load_font(L"宋体", L"host", L""); //设置主机上字体

        if (font == -1) 
        {
            wcerr << L"Error: " << p.get_errmsg() << endl;
                return(2);
        }
        //设置字体,合并单元格
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
                    << L" fontsize=18} colspan="<<colmax;
        tbl = p.add_table_cell(tbl, col, row, headertext, optlist.str());
        //---------------------row2----------------------------------------//
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=18} colspan=" << colmax ;
        tbl = p.add_table_cell(tbl, col, row, L"xx系统检查装置", optlist.str());
        // --------------------row---------------------------------------- //
        // -----第三行,跨三列*/
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=3" ;
        tbl = p.add_table_cell(tbl, col, row, L"xx名称", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=4" ;

        tbl = p.add_table_cell(tbl, col+3, row, L"", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=2" ;
        tbl = p.add_table_cell(tbl, col+7, row, L"xx检测者", optlist.str());
        //---------------------------------row 4 ---------------------------//
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=3" ;
        tbl = p.add_table_cell(tbl, col, row, L"xx型号", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=4" ;

        tbl = p.add_table_cell(tbl, col+3, row, L"", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=2" ;
        tbl = p.add_table_cell(tbl, col+7, row, L"检测日期", optlist.str());
        //--------------row 5 ------------------------------------------//
        row++;
        for(col = 1; col <=colmax;col++)
        {
            optlist.str(L"");
            optlist << L"fittextline={position=center font=" << font
                << L" fontsize=12}" ;
            tbl = p.add_table_cell(tbl, col, row, tf_text[col-1], optlist.str());
        }
        /* ---------- Fill row 5 and above with their numbers */
        for (row++; row <= rowmax; row++)
        {
            for (col = 1; col <= colmax; col++)
            {
                    wostringstream num;
                    optlist.str(L"");
                    optlist << L"colwidth=20% fittextline={font=" << font
                            <<  L" fontsize=10}";

            tbl = p.add_table_cell(tbl, col, row, L"", optlist.str());
            }
        }

        do {
            p.begin_page_ext(0, 0, L"width=a4.width height=a4.height");
            optlist.str(L"");
            optlist <<  L" header=5 rowheightdefault=auto stroke={{line=other linewidth = 0.5}}";
            result = p.fit_table(tbl, llx, lly, urx, ury, 
                           // L"header=4 rowheightdefault=auto "
                           // L"colwidth=20%"
                          //  L"fill={{area=rowodd fillcolor={gray 0.9}}} "
                          L"stroke={{line=other linewidth = 0.5}}");
                        //   optlist.str());
            if (result == L"_error") {
            wcerr << L"Couldn't place table: " << p.get_errmsg() << endl;
                    return 2;
            }

            p.end_page_ext(L"");

        } while (result == L"_boxfull");
        if (result != L"_stop") 
        {
            if (result == L"_error") 
            {
                wcerr << L"Error when placing table: " << p.get_errmsg()
                            << endl;
                    return 2;
            }
           else 
           {

            wcerr << L"User return found in Table" << endl;
                    return 2;
            }
        }
        p.delete_table(tbl, L"");

        p.end_document(L"");
        }
        catch (PDFlib::Exception &ex) {
        wcerr << L"PDFlib exception occurred:" << endl
                  << L"[" << ex.get_errnum() << L"] " << ex.get_apiname()
              << L": " << ex.get_errmsg() << endl;
        return 2;
        }

    return 0;
}

四、总结

  • 本文只是简单的对pdflib进行了一个操作,参考官网例子static_table.cpp修改而来!侵删。