找回密码
 立即注册

QQ登录

只需一步,快速开始

zysfaithboy

银牌会员

4

主题

11

帖子

2892

积分

银牌会员

积分
2892

活字格认证

zysfaithboy
银牌会员   /  发表于:2013-11-28 14:15  /   查看:7204  /  回复:4
版主,您好!

    我在咱们公司的网站上没有找到关于Spread WPF-Silverlight控件打印功能的演示,我想请问一下,咱们的控件是否支持打印功能,如果支持能否发给我一个Silverlight的例子?我的邮箱是zysfaithboy@163.com。谢谢!盼回复!

    祝好!

    2013-11-28

4 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-11-28 15:47:00
沙发
回复 1楼zysfaithboy的帖子

zysfaithboy  您好,

感谢您对 Spread 产品的支持。

Spread WPF-Silverlight控件目前不支持直接通过打印机打印功能。可以通过自定义方式实现:

  1.   private void btnPrint_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             this.Cursor = System.Windows.Input.Cursors.Wait;
  4.             SpreadSheetPrinter ssp = new SpreadSheetPrinter(this.gcSpreadSheet1);
  5.             ssp.PrintDocument.EndPrint += (ss, ee) => { this.Cursor = System.Windows.Input.Cursors.Arrow;  };
  6.             ssp.PrintActiveSheet("SpreadSheet Print");
  7.         }


  8.   public class SpreadSheetPrinter
  9.     {
  10.         GcSpreadSheet printSource;
  11.         PrintDocument pd;
  12.         string documentName;

  13.         Grid printVisual;
  14.         Grid container;
  15.         TextBlock header;
  16.         GcSpreadSheet printPreview;
  17.         TextBlock footer;

  18.         int vPageBreak;
  19.         int vNextPageBreak;
  20.         int hPageBreak;
  21.         int hNextPageBreak;
  22.         double pageWidth;
  23.         double pageHeight;

  24.         public SpreadSheetPrinter(GcSpreadSheet spread)
  25.         {
  26.             printSource = spread;
  27.             pd = new PrintDocument();
  28.             pd.PrintPage += new EventHandler<PrintPageEventArgs>(pd_PrintPage);

  29.             this.printVisual = new Grid();

  30.             this.container = new Grid();
  31.             this.container.RowDefinitions.Add(new RowDefinition());
  32.             this.container.RowDefinitions.Add(new RowDefinition());
  33.             this.container.RowDefinitions.Add(new RowDefinition());
  34.             this.printVisual.Children.Add(this.container);

  35.             this.header = new TextBlock();
  36.             this.header.FontSize = 20;
  37.             this.header.VerticalAlignment = System.Windows.VerticalAlignment.Top;
  38.             this.header.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
  39.             this.container.Children.Add(this.header);

  40.             this.footer = new TextBlock();
  41.             this.footer.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
  42.             this.footer.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
  43.             this.container.Children.Add(this.footer);
  44.             this.footer.SetValue(Grid.RowProperty, 2);

  45.             this.printPreview = new GcSpreadSheet();
  46.             this.container.Children.Add(this.printPreview);
  47.             this.printPreview.SetValue(Grid.RowProperty, 1);
  48.             this.printPreview.VerticalAlignment = System.Windows.VerticalAlignment.Top;
  49.             this.printPreview.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
  50.         }

  51.         public PrintDocument PrintDocument
  52.         {
  53.             get { return pd; }
  54.         }

  55.         public void PrintActiveSheet(string documentName)
  56.         {
  57.             MemoryStream ms = new MemoryStream();
  58.             this.printSource.SaveXml(ms);
  59.             ms.Seek(0, System.IO.SeekOrigin.Begin);
  60.             this.printPreview.OpenXml(ms);
  61.             ms.Close();

  62.             // hide scrollbar tabstrip border
  63.             this.printPreview.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
  64.             this.printPreview.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
  65.             this.printPreview.TabStripVisibility = System.Windows.Visibility.Collapsed;
  66.             this.printPreview.BorderThickness = new Thickness(0);

  67.             // hide selection
  68.             var sheet = this.printPreview.ActiveSheet;
  69.             sheet.RowCount++;
  70.             sheet.ColumnCount++;
  71.             sheet.FrozenTrailingColumnCount = 1;
  72.             sheet.FrozenTrailingRowCount = 1;
  73.             sheet.SetRowVisible(sheet.RowCount - 1, SheetArea.Cells, false);
  74.             sheet.SetColumnVisible(sheet.ColumnCount - 1, SheetArea.Cells, false);
  75.             sheet.SetActiveCell(sheet.RowCount - 1, sheet.ColumnCount - 1, true);

  76.             vPageBreak = 0;
  77.             vNextPageBreak = -1;
  78.             hPageBreak = 0;
  79.             hNextPageBreak = -1;
  80.             pageWidth = 0;
  81.             pageHeight = 0;

  82.             this.documentName = documentName;
  83.             pd.Print(documentName);
  84.         }

  85.         void pd_PrintPage(object sender, PrintPageEventArgs e)
  86.         {
  87.             var sheet = this.printPreview.ActiveSheet;
  88.             var margin = sheet.PrintInfo.Margin;

  89.             // set control position
  90.             this.container.Margin = new Thickness(margin.Left, margin.Top, margin.Right, margin.Bottom);
  91.             this.container.RowDefinitions[0].Height = new GridLength(margin.Header);
  92.             this.container.RowDefinitions[2].Height = new GridLength(margin.Footer);
  93.             this.header.Text = this.documentName;
  94.             this.footer.Text = string.Format("page {0}", this.pd.PrintedPageCount + 1);

  95.             // scroll to current page
  96.             this.printPreview.ShowRow(0, vPageBreak, VerticalPosition.Top);
  97.             this.printPreview.ShowColumn(0, hPageBreak, HorizontalPosition.Left);

  98.             // calc current page size, and find next page break
  99.             if (pageHeight == 0) // current page height is not calc yet
  100.             {
  101.                 for (int i = vPageBreak; i < sheet.RowCount; i++)
  102.                 {
  103.                     double rowHeight = sheet.GetActualRowHeight(i, SheetArea.Cells) * sheet.ZoomFactor;
  104.                     if ((pageHeight + rowHeight) > (e.PrintableArea.Height - margin.Bottom - margin.Top - margin.Header - margin.Footer))
  105.                     {
  106.                         vNextPageBreak = i;
  107.                         break;
  108.                     }
  109.                     pageHeight += rowHeight;
  110.                 }
  111.                 if (this.printPreview.Height != pageHeight)
  112.                 {
  113.                     this.printPreview.Height = pageHeight;
  114.                 }
  115.             }
  116.             if (pageWidth == 0) // current page width is not calc yet
  117.             {
  118.                 for (int i = hPageBreak; i < sheet.ColumnCount; i++)
  119.                 {
  120.                     double columnWidth = sheet.GetActualColumnWidth(i, SheetArea.Cells) * sheet.ZoomFactor;
  121.                     if ((pageWidth + columnWidth) > (e.PrintableArea.Width - margin.Left - margin.Right))
  122.                     {
  123.                         hNextPageBreak = i;
  124.                         break;
  125.                     }
  126.                     pageWidth += columnWidth;
  127.                 }
  128.                 if (this.printPreview.Width != pageWidth)
  129.                 {
  130.                     this.printPreview.Width = pageWidth;
  131.                 }
  132.             }

  133.             e.PageVisual = this.printVisual;

  134.             // prepare for next page
  135.             if (sheet.PrintInfo.PageOrder == PrintPageOrder.DownThenOver)
  136.             {
  137.                 if (vNextPageBreak != -1) // has next page in vertical
  138.                 {
  139.                     vPageBreak = vNextPageBreak;
  140.                     vNextPageBreak = -1;
  141.                     pageHeight = 0;
  142.                     e.HasMorePages = true;
  143.                 }
  144.                 else if (hNextPageBreak != -1)
  145.                 {
  146.                     hPageBreak = hNextPageBreak;
  147.                     hNextPageBreak = -1;
  148.                     pageWidth = 0;
  149.                     pageHeight = 0;
  150.                     vPageBreak = 0;
  151.                     vNextPageBreak = -1;
  152.                     e.HasMorePages = true;
  153.                 }
  154.             }
  155.             else
  156.             {
  157.                 if (hNextPageBreak != -1)
  158.                 {
  159.                     hPageBreak = hNextPageBreak;
  160.                     hNextPageBreak = -1;
  161.                     pageWidth = 0;
  162.                     e.HasMorePages = true;
  163.                 }
  164.                 else if (vNextPageBreak != -1)
  165.                 {
  166.                     vPageBreak = vNextPageBreak;
  167.                     vNextPageBreak = -1;
  168.                     pageWidth = 0;
  169.                     pageHeight = 0;
  170.                     hPageBreak = 0;
  171.                     hNextPageBreak = -1;
  172.                     e.HasMorePages = true;
  173.                 }
  174.             }
  175.         }
  176.     }
复制代码


同时支持导出到 PDF 文件。
有其他问题,欢迎继续提出。

谢谢
回复 使用道具 举报
zysfaithboy
银牌会员   /  发表于:2013-11-28 15:58:00
板凳
非常感谢版主回复,不知道咱们公司有没有计划在咱们的控件中增加自带的打印功能,如果有计划,大概能够在什么时间推出该版本?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-11-28 18:27:00
地板
回复 3楼zysfaithboy的帖子

zysfaithboy 你好,
目前“打印功能”没有明确的添加计划。
我需要和开发组再次确认后给你回复。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-12-10 10:01:00
5#
回复 3楼zysfaithboy的帖子

您好,

目前 Spread 8.0 在XAML和WinRT平台产品中提供了打印和打印预览功能,公式支持结构化引用,新的控件外观,更重要的是在Excel导入速度方面也有明显的提升。

下载链接:
http://www.gcpowertools.com.cn/d ... F-Silverlightv8.zip

谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部