找回密码
 立即注册

QQ登录

只需一步,快速开始

zysfaithboy

银牌会员

4

主题

11

帖子

2892

积分

银牌会员

积分
2892

活字格认证

zysfaithboy
银牌会员   /  发表于:2014-1-28 16:33  /   查看:7534  /  回复:6
版主您好!
    我们用silverlight开发的系统用到了咱们spread组件,关于咱们spread组件的打印功能能否提供一个例程?谢谢!

6 个回复

倒序浏览
roger.wang
社区贡献组   /  发表于:2014-1-28 18:02:00
沙发
回复 1楼zysfaithboy的帖子

目前Spread  Silverlight/WPF版本不支持直接打印功能,非常抱歉。

有2个办法:
方法一:
  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,然后调用PDF的打印功能去打印
        在进行 PDF 导出时,中文字体需要使用 SimSun 字体,不然就会出现乱码
回复 使用道具 举报
zysfaithboy
银牌会员   /  发表于:2014-1-28 18:12:00
板凳
非常感谢版主回复,您能不能把方法一所在的工程压一个包,发给我们学习一下。谢谢!
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-1-29 12:34:00
地板
回复 3楼zysfaithboy的帖子

帮您整理了一个包,供您参考:

SL_WPF_Spread_print.rar (2.61 MB, 下载次数: 687)
回复 使用道具 举报
zysfaithboy
银牌会员   /  发表于:2014-2-10 09:04:00
5#
收到,非常感谢版主!
回复 使用道具 举报
roger.wang
社区贡献组   /  发表于:2014-2-10 10:31:00
6#
回复 5楼zysfaithboy的帖子

  客气了
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-12-10 10:01:00
7#
回复 5楼zysfaithboy的帖子

您好,

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

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

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