找回密码
 立即注册

QQ登录

只需一步,快速开始

yimi020103

金牌服务用户

31

主题

105

帖子

278

积分

金牌服务用户

积分
278

活字格认证微信认证勋章元老葡萄

yimi020103
金牌服务用户   /  发表于:2015-3-20 10:00  /   查看:23005  /  回复:23
如题

现在做一个功能,要把多个sheet按页导出pdf文件
用fpSpread.SafePrint(fpSpread, 0);
这个方法只能输出一个sheet,再用就会把原来的覆盖掉
PrintInfo.PdfWriteMode 改成 Append 好像没什么用……
请问有没有哪个方法是把第2页放到第1页之后的?
而且输出到一个文件中的?

23 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-3-20 17:45:00
沙发
回复 1楼yimi020103的帖子

目前没有直接导出所有sheet到 pdf 文件的方法,提供一个work around,保存需要导出的多个sheet到同一Spread 控件中,再打印这个 spread 控件,请参考附件 demo:
Spread_MultipleXL_PDF.zip (43.68 KB, 下载次数: 2180)
回复 使用道具 举报
yimi020103
金牌服务用户   /  发表于:2015-3-23 11:33:00
板凳
回复 2楼iceman的帖子

还是有毛病……添加但是数量没有增加
我用您的方法试着把同一个sheet往一个新的控件中循环add了好多遍 但是只有最后一页留下来了……
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-23 17:03:00
地板
回复 3楼yimi020103的帖子

你好。
尝试2楼给出的Sample,可以将多个sheet打印到一个pdf文件。

根据你的描述,你使用该方法移植到自己的程序里出错。
你可以根据示例排查自己写的逻辑或代码有没有问题。
也可以提供代码具体是怎样写的,最好能提供出错的Demo,我们可以帮你看看是否代码有问题。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yimi020103
金牌服务用户   /  发表于:2015-3-23 17:51:00
5#
Demo不会写诶……不好意思 还是把代码放上来请大神找找问题吧

        private void ExportPages()
        {
            FarPoint.Win.Spread.FpSpread Spread = new FarPoint.Win.Spread.FpSpread();
            FarPoint.Win.Spread.SheetViewCollection coll;
            coll = fpSpread1.Sheets;
            //Copy表头
            fpSpread1.Sheets[0].ClipboardCopy(new CellRange(1, 1, 6, 12));
            fpSpread1.Sheets[1].SetActiveCell(1, 1);
            fpSpread1.Sheets[1].ClipboardPaste(ClipboardPasteOptions.All);
            //Copy表尾
            fpSpread1.Sheets[0].ClipboardCopy(new CellRange(30, 1, 1, 12));
            fpSpread1.Sheets[1].SetActiveCell(12, 1);
            fpSpread1.Sheets[1].ClipboardPaste(ClipboardPasteOptions.All);
            //Copy数据区域
            int numPages = 0;
            if (_BillCount % 4 == 0) numPages = _BillCount / 4;
            if (_BillCount % 4 != 0) numPages = _BillCount / 4 + 1;
            for (int i = 0; i < _BillCount; i++)
            {
                if (i != 0 && i % 4 == 0)
                {
                    string page = "第" + (i / 4).ToString() + "页 / 共" + numPages.ToString() + "页";
                    fpSpread1.Sheets[1].Cells.Get(18, 0).Text = page;
                    coll.Add(fpSpread1.Sheets[1]);
                    ClearDataField();
                }
                fpSpread1.Sheets[0].ClipboardCopy(new CellRange(i + 8, 1, 1, 12));
                fpSpread1.Sheets[1].SetActiveCell(i % 4 + 8, 1);
                fpSpread1.Sheets[1].ClipboardPaste(ClipboardPasteOptions.All);
                if (i == _BillCount - 1)
                {
                    string page = "第" + (i / 4 + 1).ToString() + "页 / 共" + numPages.ToString() + "页";
                    fpSpread1.Sheets[1].Cells.Get(18, 0).Text = page;
                    coll.Add(fpSpread1.Sheets[1]);
                    break;
                }
            }
            for (int i = 0; i < coll.Count; i++)
            {
                Spread.Sheets.Add(coll);
            }

            this.Controls.Add(Spread);

            for (int i = 0; i < coll.Count; i++)
            {
                Spread.Sheets.PrintInfo = _printInfo;
            }
            try
            {
                Spread.PrintSheet(-1); //打印控件的所有标签页
                UIMessageUtil.ShowInformationMessage("导出PDF成功");
            }
            catch (Exception ex)
            {
                UIMessageUtil.ShowInformationMessage("导出PDF失败\n\n" + ex.Message);
            }
            return;
        }

大致就是这个逻辑吧,我希望表头和表尾固定不变,只把中间的4行数据一次次地粘贴过来做成新的sheet
每做成一个sheet就收集起来,最后一起打印
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-24 11:53:00
6#
回复 5楼yimi020103的帖子

你的代码在我这里不能直接运行,给调试程序造成了难度。

仅从代码来看,没有看到Spread.Sheets.PrintInfo的相关设置。PrintInfo.PdfWriteMode需要设置为PdfWriteMode.Append。
另外,Spread下的每个sheet都需要设置PrintInfo。

就是缺少下述代码:
  1. FarPoint.Win.Spread.PrintInfo printset = new FarPoint.Win.Spread.PrintInfo();
  2.             printset.PrintToPdf = true;
  3.             printset.PdfWriteMode = PdfWriteMode.Append;
  4.             printset.PdfFileName = @"filename.pdf";
  5.             
  6.             Spread.Sheets[0].PrintInfo = printset;
  7.             Spread.Sheets[1].PrintInfo = printset;
  8.             Spread.Sheets[2].PrintInfo = printset;
复制代码


建议你根据示例排查代码逻辑是否有误。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yimi020103
金牌服务用户   /  发表于:2015-3-24 14:52:00
7#
回复 6楼Alice的帖子

哦 你是说打印设置吗,我在另一个函数里设定的
  1.         private void SetPrintInfo(string strPath)
  2.         {
  3.             FarPoint.Win.Spread.PrintInfo pi = new FarPoint.Win.Spread.PrintInfo();
  4.             //打印成pdf文档
  5.             pi.PrintToPdf = true;
  6.             pi.ShowGrid = false;
  7.             pi.ShowBorder = false;
  8.             //水平居中还是上下居中
  9.             pi.Centering = FarPoint.Win.Spread.Centering.Horizontal;
  10.             //新建还是添加
  11.             pi.PdfWriteMode = FarPoint.Win.Spread.PdfWriteMode.Append;
  12.             //打印成pdf文档
  13.             pi.PdfWriteTo = FarPoint.Win.Spread.PdfWriteTo.File;
  14.             //纵向、横向打印
  15.             pi.Orientation = FarPoint.Win.Spread.PrintOrientation.Landscape;
  16.             //隐藏行头和列头
  17.             pi.ShowRowHeader = FarPoint.Win.Spread.PrintHeader.Hide;
  18.             pi.ShowColumnHeader = FarPoint.Win.Spread.PrintHeader.Hide;
  19.             //取得文件的路径及名称
  20.             pi.PdfFileName = strPath;

  21.             //解决Spread打印纸质单据,与Spread Designer中打印不一致问题:
  22.             //Spread Designer中可以正常打印
  23.             //程序中加载后横向表格超出页宽
  24.             //智能打印
  25.             //pi.UseSmartPrint = true;
  26.             ////自适应,与智能打印配合使用
  27.             //pi.BestFitCols = true;

  28.             pi.Margin.Top = 30;
  29.             pi.Margin.Bottom = 30;
  30.             pi.Margin.Left = 10;
  31.             pi.Margin.Right = 10;

  32.             fpSpread1.Sheets[0].PrintInfo = pi;
  33.             fpSpread1.Sheets[1].PrintInfo = pi; //把第2个标签页也赋同样格式
  34.             _printInfo = pi;
  35.         }
复制代码


文件名、追加打印和输出PDF都没错,但是别的设置会不会有冲突就不知道了

另外还有个问题想问一下:
Invalid row index: 37 (must be between 0 and 18)
这个异常是什么意思?我对sheet的大小做过限制吗?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-24 18:22:00
8#
回复 7楼yimi020103的帖子

这个异常的意思是无效的Rowindex,并指出是37。
实际应该在0到18之间。

由于这些代码设计到你的业务逻辑,从代码上看不出其中的冲突。
如果你自己不能找到问题,需要我协助的话,请提供相关的示例,这样子,可以为你节省沟通的成本。我们可以帮你看看示例中有什么问题。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
yimi020103
金牌服务用户   /  发表于:2015-3-25 11:02:00
9#
回复 8楼Alice的帖子

列表大小果然是我在初始化的时候设置过了,所以才出错的

关于之前导出的问题,还是找不出解决方案
我想通过把多页复制到同一个sheet里来打印的方法解决,目前一切顺利
只不过我的模板左上角有个图标,保留表头的话每页输出都应该有这个图标才对
现在有一个小问题:复制的时候单元格的内容和格式都能复制,图片却丢了
这种情况我应该怎样把图片也复制过去呢?
那图标是放在模板里的,模板是加载到控件里的,这图标算不算一个控件呢?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-3-25 16:37:00
10#
回复 9楼yimi020103的帖子

请问左上角图标具体指的是什么?SheetConner 吗?建议您先获取这个图片然后添加到目标打印 Sheet 中。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部