C#操作excel打印的示例

using System;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
    private bool isStartPrint = false;

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      //string OriginalPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\IMS.accdb";
      ////初始化数据库
      //DataBase.OleDbObject.InitDatabase(OriginalPath);
      //DataBase.OleDbObject.OpenDb();
      //int k=DataBase.OleDbObject.Select("select * from ElementInventory").Rows.Count;

      //初始化要写入Excel的数据
      DataTable dt = new DataTable();
      for (int i = 0; i < 11; i++)
      {
        DataColumn dc = new DataColumn();
        dc.ColumnName = "name" + i;
        dc.DataType = typeof(string);
        dt.Columns.Add(dc);
      }
      for (int i = 0; i < 30; i++)
      {
        DataRow dr = dt.NewRow();
        if (i % 2 == 0)
        {
          dr[0] = "测试用例" + i + "号,开始测试是否自动换行,以及页面高度自适应。";
        }
        else
        {
          dr[0] = "测试用例" + i + "号";
        }
        for (int j = 1; j < 11; j++)
        {
          dr[j] = j;
        }
        dt.Rows.Add(dr);
      }
      if (!isStartPrint)
      {
        Thread th = new Thread(delegate ()
        {
          DataTabletoExcel(dt, "测试.xlsx");
        });
        th.Start();
        isStartPrint = true;
      }
      else
      {
        MessageBox.Show("打印程序已启用,请稍后……", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
      }
      //DataTabletoExcel(dt, "测试.xlsx");
    }

    public void DataTabletoExcel(System.Data.DataTable dtTemp, string strFileName)
    {
      int rowNum = dtTemp.Rows.Count; //先得到dtTemp的行数
      int columnNum = dtTemp.Columns.Count; //列数
      Excel.Application ExcelApp = new Excel.Application(); //声明一个应用程序类实例

      //ExcelApp.DefaultFilePath = ""; //默认文件路径导出excel的路径还是在参数strFileName里设置
      //ExcelApp.DisplayAlerts = true;
      //ExcelApp.SheetsInNewWorkbook = 1;///返回或设置 Microsoft Excel 自动插入到新工作簿中的工作表数目。
      Excel.Workbook worksBook = ExcelApp.Workbooks.Add(); //创建一个新工作簿
      Excel.Worksheet workSheet = (Excel.Worksheet)worksBook.Worksheets[1]; //在工作簿中得到sheet。
      if (workSheet == null)
      {
        System.Diagnostics.Debug.WriteLine("ERROR: worksheet == null");
        return;
      }
      workSheet.Name = "测试Sheet1"; //工作表的名称
      workSheet.Cells.WrapText = true; //设置所有列的文本自动换行
      workSheet.Cells.EntireRow.AutoFit(); //设置所有列自动调整行高
      #region 绘制列
      ///自定义方法,向sheet中绘制列
      RangeMark(workSheet, "A1", "A2", "合并竖列1");
      RangeMark(workSheet, "B1", "B2", "合并竖列2");
      RangeMark(workSheet, "C1", "C2", "合并竖列3");
      RangeMark(workSheet, "D1", "D2", "合并竖列4");
      RangeMark(workSheet, "E1", "E2", "合并竖列5");
      RangeMark(workSheet, "F1", "H1", "合并横行1");
      RangeMark(workSheet, "F2", "F2", "合并横行1.1");
      RangeMark(workSheet, "G2", "G2", "合并横行1.2");
      RangeMark(workSheet, "H2", "H2", "合并横行1.3");
      RangeMark(workSheet, "I1", "K1", "合并横行2");
      RangeMark(workSheet, "I2", "J2", "合并横行2.1");
      RangeMark(workSheet, "K2", "K2", "合并横行2.2");
      #endregion
      //将DataTable中的数据导入Excel中
      for (int i = 0; i < rowNum; i++)
      {
        for (int j = 0; j < columnNum; j++)
        {
          workSheet.Cells[i + 3, j + 1] = dtTemp.Rows[i][j].ToString(); //文本

        }
      }
      ///保存路径
      string filePath = @"C:\Users\Admin\Desktop\" + strFileName;
      if (File.Exists(filePath))
      {
        try
        {
          File.Delete(filePath);
        }
        catch (Exception)
        {

        }
      }
      ExcelApp.Visible = true;
      //------------------------打印页面相关设置--------------------------------
      workSheet.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4;//纸张大小
      workSheet.PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape;//页面横向
                                         //workSheet.PageSetup.Zoom = 75; //打印时页面设置,缩放比例百分之几
      workSheet.PageSetup.Zoom = false; //打印时页面设置,必须设置为false,页高,页宽才有效
      workSheet.PageSetup.FitToPagesWide = 1; //设置页面缩放的页宽为1页宽
      workSheet.PageSetup.FitToPagesTall = false; //设置页面缩放的页高自动
      workSheet.PageSetup.LeftHeader = "Nigel";//页面左上边的标志
      workSheet.PageSetup.CenterFooter = "第 &P 页,共 &N 页";//页面下标
      workSheet.PageSetup.PrintGridlines = true; //打印单元格网线
      workSheet.PageSetup.TopMargin = 1.5 / 0.035; //上边距为2cm(转换为in)
      workSheet.PageSetup.BottomMargin = 1.5 / 0.035; //下边距为1.5cm
      workSheet.PageSetup.LeftMargin = 2 / 0.035; //左边距为2cm
      workSheet.PageSetup.RightMargin = 2 / 0.035; //右边距为2cm
      workSheet.PageSetup.CenterHorizontally = true; //文字水平居中
                              //------------------------打印页面设置结束--------------------------------
                              ///http://blog.csdn.net/wanmingtom/article/details/6125599
      worksBook.PrintPreview(); //打印预览
                   //worksBook.PrintOutEx(); //直接打印
                   //worksBook.Close(); //关闭工作空间
                   //ExcelApp.Quit(); //退出程序
                   //workSheet.SaveAs(filePath); //另存表
      KillProcess(ExcelApp); //杀掉生成的进程
      isStartPrint = false; //打印完毕
      GC.Collect(); //垃圾回收机制
    }
    /// <summary>
    /// 引用Windows句柄,获取程序PID
    /// </summary>
    /// <param name="Hwnd"></param>
    /// <param name="PID"></param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    public static extern int GetWindowThreadProcessId(IntPtr Hwnd, out int PID);
    /// <summary>
    /// 杀掉生成的进程
    /// </summary>
    /// <param name="AppObject">进程程对象</param>
    private static void KillProcess(Excel.Application AppObject)
    {
      int Pid = 0;
      IntPtr Hwnd = new IntPtr(AppObject.Hwnd);
      System.Diagnostics.Process p = null;
      try
      {
        GetWindowThreadProcessId(Hwnd, out Pid);
        p = System.Diagnostics.Process.GetProcessById(Pid);
        if (p != null)
        {
          p.Kill();
          p.Dispose();
        }
      }
      catch (Exception ex)
      {
        System.Diagnostics.Debug.WriteLine("进程关闭失败!异常信息:" + ex);
      }
    }

    /// <summary>
    /// 创建表头单元格,包括合并单元格
    /// </summary>
    /// <param name="workSheet">工作表</param>
    /// <param name="startCell">单元格起始格编号</param>
    /// <param name="endCell">单元格结束编号</param>
    /// <param name="strText">单元格名称</param>
    private static bool RangeMark(Excel.Worksheet workSheet, string startCell, string endCell, string strText)
    {
      //创建一个区域对象。第一个参数是开始格子号,第二个参数是终止格子号。比如选中A1——D3这个区域。
      Excel.Range range = (Excel.Range)workSheet.get_Range(startCell, endCell);
      if (range == null)
      {
        System.Diagnostics.Debug.WriteLine("ERROR: range == null");
        return false;
      }
      range.Merge(0); //合并方法,0的时候直接合并为一个单元格
      range.Font.Size = 16; //字体大小
      range.Font.Name = "黑体"; //字体
      range.WrapText = true; //文本自动换行
      range.EntireRow.AutoFit(); //自动调整行高
                    //range.RowHeight = 20;
                    //range.EntireColumn.AutoFit(); //自动调整列宽
      range.ColumnWidth = 15;
      range.HorizontalAlignment = XlVAlign.xlVAlignCenter; //横向居中
      range.Value = strText; //合并单元格之后,设置其中的文本
      range.Interior.ColorIndex = 20; //填充颜色
      range.Cells.Borders.LineStyle = 1; //设置单元格边框的粗细

      return true;
    }
  }
}

以上就是C#操作excel打印的示例的详细内容,更多关于c# 打印的资料请关注我们其它相关文章!

(0)

相关推荐

  • C# 打印网页不显示页眉页脚的实现方法

    1.在IE浏览器点"打印"-"页面设置",IE的默认设置如下图 2.设置在注册表里 3.C#代码实现 4.Javascript代码实现 5.法二,使用JS修改注册表,但是失败,有机会研究一下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • C# 导出Excel的6种简单方法实现

    作者 | Johnson Manohar 译者 | 谭开朗,责编 | 黄浩然 出品 | CSDN(ID:CSDNnews) Syncfusion Excel (XlsIO) 库是一个 .Net Excel 库,它支持用户用 C# 和 VB.NET 以一个非常简易的方式,将各种数据源(如数据表,数组,对象集合,数据库,CSV / TSV,和微软网格控件等)数据导出到 Excel . 将数据导出到 Excel 可以以更容易理解的方式可视化数据.该特性有助于生成财务报告.银行报表和发票,同时还支持筛选

  • C#打印日志的方法总结

    在我们对程序进行操作过程中,一般都需要有一个操作流程的记录显示.用C#进行编程时可以很容易实现这个功能.本经验提供案例仅供参考 下面小编就来介绍一下如何使用textbox控件实现日志功能. 打开Visual Studio 2010,建立一个新的C#程序.在工具箱中双击[textbox]控件. 在界面上放置一个[textbox]控件作为日志显示,同时添加一个按钮控件. 添加日志显示的方法[displaylog],在textbox控件中输入信息. 在load方法中调用[displaylog]方法,输

  • c# 获取已安装的打印机并调用打印文件

    C# 获取所有安装了的打印机代码如下: using System.Drawing.Printing; var printers = PrinterSettings.InstalledPrinters; foreach (var item in printers) { Console.WriteLine(item.ToString()); } C# 调用打印机打印文件,通常情况下,例如Word.Excel.PDF等可以使用一些对应的组件进行打印,另一个通用的方式是直接启用一个打印的进程进行打印.示

  • C#完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选择非默认打印机或者说想显示打印设置对话框时,我们也需要对代码进行一定的设置. 针对这样的问题,今天这篇文章我就来分享一下如何利用免费的第三方组件轻松打印word文档.免费组件简化了代码,提高我们的工作效率,何乐而不为呢.所以,在下面的示例中我使用了其中一个Free Spire.Doc组件来实现这一功

  • C#实现扫描枪扫描二维码并打印(实例代码)

    1.使用usb口输入的扫描枪,这里实现使用了winform 首先创建一个CS文件 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace am_sign { class BardCodeHooK { public delegate voi

  • C#操作Excel相关方法总结

    0.导入命名空间: using Microsoft.Office.Core; using Microsoft.Office.Interop.Excel; using System.IO; using System.Reflection; 1.如何打开已有excel文档,或者创建一个新的excel文档 Application app = new Application(); Workbooks wbks = app.Workbooks; _Workbook _wbk = wbks.Add(xxx)

  • C# winform打印excel的方法

    前言 c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点在于如何将excel转换成Graphics对象,在NPOI中我只找到了excel打印的设置(如横向/纵向),还需要打开excel去触发打印操作,但项目要求是一次性直接实现打印,要用PrintDocument控件而不是再去操作excel.不得已重新搜索,发现了类库Spire.xls,最终实现了要求.有

  • 详解C#读写Excel的几种方法

    1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel 读写代码如下: using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; private void btn_Office_Click(object sender, EventArgs e) { s

  • C#插入图片到Excel表格单元格代码详解

    dll文件获取及引用: 方法1:通过官网下载dll文件包,并解压.解压文件后,将bin文件夹下的Spire.Xls.dll文件引用到C#程序. 方法2:通过Nuget网站获取dll. C#代码示例 using Spire.Xls; using System.Drawing; namespace InsertImage_XLS { class Program { static void Main(string[] args) { //创建Workbook对象 Workbook workbook =

随机推荐