找回密码
 立即注册

QQ登录

只需一步,快速开始

p332718873

论坛元老

42

主题

85

帖子

8225

积分

论坛元老

积分
8225

活字格认证

p332718873
论坛元老   /  发表于:2013-4-17 15:25  /   查看:6682  /  回复:2
请版主贴下打印功能的代码。谢谢~

2 个回复

倒序浏览
Zoe
银牌会员   /  发表于:2013-4-17 18:30:00
沙发
回复 1楼p332718873的帖子

这是一个workaround,我们在V2.0的版本会提供打印功能.
  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.     }
复制代码
回复 使用道具 举报
Zoe
银牌会员   /  发表于:2013-4-17 18:32:00
板凳
回复 1楼p332718873的帖子

如果不想写这么多代码的话,
可以先打印成PDF,然后调用PDF的打印功能去打印。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部