Winform将DataGridView导出Excel,调用打印机打印DataGridView

DataGridView导出Excel

(这个需要Microsoft.Office.Interop.Excel.dll 在网上下载就可以)

public static void ExportExcel(string fileName, DataGridView myDGV){string saveFileName = "";SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel文件|*.xls";saveDialog.FileName = fileName;saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1//写入标题for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;}//写入数值for (int r = 0; r < myDGV.Rows.Count; r++){for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;}System.Windows.Forms.Application.DoEvents();}worksheet.Columns.EntireColumn.AutoFit();//列宽自适应if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);}}xlApp.Quit();GC.Collect();//强行销毁MessageBox.Show("文件: " + fileName + ".xls 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}

打印机打印DataGridView

1. 首先创建打印类

using System;using System.Text;using System.Collections;using System.Collections.Generic;using System.Drawing;using System.Drawing.Printing;using System.Data;using System.Windows.Forms;namespace WCY_LAB { public class GridPrinter{// the grid to printprivate DataGridView dataGridView;// the PrintDocumentprivate PrintDocument printDocument;// center printout?private bool centerOnPage;// has a title?private bool hasTitle;// titleprivate string title;// fontprivate Font titleFont;// title colorprivate Color titleColor;// use paging?private bool paging;// row printingstatic int currentRow;// page printingstatic int pageNumber;// page widthprivate int pageWidth;// page heightprivate int pageHeight;// left marginprivate int leftMargin;// top marginprivate int topMargin;// right marginprivate int rightMargin;// bottom marginprivate int bottomMargin;// y location placeholderprivate float currentY;// grid sizesprivate float rowHeaderHeight;private List<float> rowsHeight;private List<float> columnsWidth;private float dataGridViewWidth;// column stop pointsprivate List<int[]> mColumnPoints;private List<float> mColumnPointsWidth;private int mColumnPoint;public GridPrinter(DataGridView objDataGridView, PrintDocument objPrintDocument, bool bCenterOnPage, bool bHasTitle, string sTitle, Font objTitleFont, Color objTitleColor, bool bPaging){dataGridView = objDataGridView;printDocument = objPrintDocument;centerOnPage = bCenterOnPage;hasTitle = bHasTitle;title = sTitle;titleFont = objTitleFont;titleColor = objTitleColor;paging = bPaging;pageNumber = 0;rowsHeight = new List<float>();columnsWidth = new List<float>();mColumnPoints = new List<int[]>();mColumnPointsWidth = new List<float>();if (!printDocument.DefaultPageSettings.Landscape){pageWidth = printDocument.DefaultPageSettings.PaperSize.Width;pageHeight = printDocument.DefaultPageSettings.PaperSize.Height;}else{pageHeight = printDocument.DefaultPageSettings.PaperSize.Width;pageWidth = printDocument.DefaultPageSettings.PaperSize.Height;}leftMargin = printDocument.DefaultPageSettings.Margins.Left;topMargin = printDocument.DefaultPageSettings.Margins.Top;rightMargin = printDocument.DefaultPageSettings.Margins.Right;bottomMargin = printDocument.DefaultPageSettings.Margins.Bottom;currentRow = 0;}// calculate printing metricsprivate void Calculate(Graphics g){if (pageNumber == 0){SizeF tmpSize = new SizeF();Font tmpFont;float tmpWidth;dataGridViewWidth = 0;for (int i = 0; i < dataGridView.Columns.Count; i++){tmpFont = dataGridView.ColumnHeadersDefaultCellStyle.Font;if (tmpFont == null)tmpFont = dataGridView.DefaultCellStyle.Font;tmpSize = g.MeasureString(dataGridView.Columns[i].HeaderText, tmpFont);tmpWidth = tmpSize.Width;rowHeaderHeight = tmpSize.Height;for (int j = 0; j < dataGridView.Rows.Count; j++){tmpFont = dataGridView.Rows[j].DefaultCellStyle.Font;if (tmpFont == null)tmpFont = dataGridView.DefaultCellStyle.Font;tmpSize = g.MeasureString("Anything", tmpFont);rowsHeight.Add(tmpSize.Height);tmpSize = g.MeasureString(dataGridView.Rows[j].Cells[i].EditedFormattedValue.ToString(), tmpFont);if (tmpSize.Width > tmpWidth)tmpWidth = tmpSize.Width;}if (dataGridView.Columns[i].Visible)dataGridViewWidth += tmpWidth;columnsWidth.Add(tmpWidth);}int k;int mStartPoint = 0;for (k = 0; k < dataGridView.Columns.Count; k++)if (dataGridView.Columns[k].Visible){mStartPoint = k;break;}int mEndPoint = dataGridView.Columns.Count;for (k = dataGridView.Columns.Count – 1; k >= 0; k–)if (dataGridView.Columns[k].Visible){mEndPoint = k + 1;break;}float mTempWidth = dataGridViewWidth;float mTempPrintArea = (float)pageWidth – (float)leftMargin – (float)rightMargin;if (dataGridViewWidth > mTempPrintArea){mTempWidth = 0.0F;for (k = 0; k < dataGridView.Columns.Count; k++){if (dataGridView.Columns[k].Visible){mTempWidth += columnsWidth[k];if (mTempWidth > mTempPrintArea){mTempWidth -= columnsWidth[k];mColumnPoints.Add(new int[] { mStartPoint, mEndPoint });mColumnPointsWidth.Add(mTempWidth);mStartPoint = k;mTempWidth = columnsWidth[k];}}mEndPoint = k + 1;}}mColumnPoints.Add(new int[] { mStartPoint, mEndPoint });mColumnPointsWidth.Add(mTempWidth);mColumnPoint = 0;}}// header printingprivate void DrawHeader(Graphics g){currentY = (float)topMargin;if (paging){pageNumber++;string PageString = "Page " + pageNumber.ToString();StringFormat PageStringFormat = new StringFormat();PageStringFormat.Trimming = StringTrimming.Word;PageStringFormat.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.LineLimit | StringFormatFlags.NoClip;PageStringFormat.Alignment = StringAlignment.Far;Font PageStringFont = new Font("Arial", 8, FontStyle.Regular, GraphicsUnit.Point);RectangleF PageStringRectangle = new RectangleF((float)leftMargin, currentY, (float)pageWidth – (float)rightMargin – (float)leftMargin, g.MeasureString(PageString, PageStringFont).Height);g.DrawString(PageString, PageStringFont, new SolidBrush(Color.Black), PageStringRectangle, PageStringFormat);currentY += g.MeasureString(PageString, PageStringFont).Height;}if (hasTitle){StringFormat TitleFormat = new StringFormat();TitleFormat.Trimming = StringTrimming.Word;TitleFormat.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.LineLimit | StringFormatFlags.NoClip;if (centerOnPage)TitleFormat.Alignment = StringAlignment.Center;elseTitleFormat.Alignment = StringAlignment.Near;RectangleF TitleRectangle = new RectangleF((float)leftMargin, currentY, (float)pageWidth – (float)rightMargin – (float)leftMargin, g.MeasureString(title, titleFont).Height);g.DrawString(title, titleFont, new SolidBrush(titleColor), TitleRectangle, TitleFormat);currentY += g.MeasureString(title, titleFont).Height;}float CurrentX = (float)leftMargin;if (centerOnPage)CurrentX += (((float)pageWidth – (float)rightMargin – (float)leftMargin) – mColumnPointsWidth[mColumnPoint]) / 2.0F;Color HeaderForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;if (HeaderForeColor.IsEmpty)HeaderForeColor = dataGridView.DefaultCellStyle.ForeColor;SolidBrush HeaderForeBrush = new SolidBrush(HeaderForeColor);Color HeaderBackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;if (HeaderBackColor.IsEmpty)HeaderBackColor = dataGridView.DefaultCellStyle.BackColor;SolidBrush HeaderBackBrush = new SolidBrush(HeaderBackColor);Pen TheLinePen = new Pen(dataGridView.GridColor, 1);Font HeaderFont = dataGridView.ColumnHeadersDefaultCellStyle.Font;if (HeaderFont == null)HeaderFont = dataGridView.DefaultCellStyle.Font;RectangleF HeaderBounds = new RectangleF(CurrentX, currentY, mColumnPointsWidth[mColumnPoint], rowHeaderHeight);g.FillRectangle(HeaderBackBrush, HeaderBounds);StringFormat CellFormat = new StringFormat();CellFormat.Trimming = StringTrimming.Word;CellFormat.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.LineLimit | StringFormatFlags.NoClip;RectangleF CellBounds;float ColumnWidth;for (int i = (int)mColumnPoints[mColumnPoint].GetValue(0); i < (int)mColumnPoints[mColumnPoint].GetValue(1); i++){if (!dataGridView.Columns[i].Visible) continue;ColumnWidth = columnsWidth[i];if (dataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Right"))CellFormat.Alignment = StringAlignment.Far;else if (dataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Center"))CellFormat.Alignment = StringAlignment.Center;elseCellFormat.Alignment = StringAlignment.Near;CellBounds = new RectangleF(CurrentX, currentY, ColumnWidth, rowHeaderHeight);g.DrawString(dataGridView.Columns[i].HeaderText, HeaderFont, HeaderForeBrush, CellBounds, CellFormat);if (dataGridView.RowHeadersBorderStyle != DataGridViewHeaderBorderStyle.None)g.DrawRectangle(TheLinePen, CurrentX, currentY, ColumnWidth, rowHeaderHeight);CurrentX += ColumnWidth;}currentY += rowHeaderHeight;}// common row printing functionprivate bool DrawRows(Graphics g){Pen TheLinePen = new Pen(dataGridView.GridColor, 1);Font RowFont;Color RowForeColor;Color RowBackColor;SolidBrush RowForeBrush;SolidBrush RowBackBrush;SolidBrush RowAlternatingBackBrush;StringFormat CellFormat = new StringFormat();CellFormat.Trimming = StringTrimming.Word;CellFormat.FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.LineLimit;RectangleF RowBounds;float CurrentX;float ColumnWidth;while (currentRow < dataGridView.Rows.Count){if (dataGridView.Rows[currentRow].Visible){RowFont = dataGridView.Rows[currentRow].DefaultCellStyle.Font;if (RowFont == null)RowFont = dataGridView.DefaultCellStyle.Font;RowForeColor = dataGridView.Rows[currentRow].DefaultCellStyle.ForeColor;if (RowForeColor.IsEmpty)RowForeColor = dataGridView.DefaultCellStyle.ForeColor;RowForeBrush = new SolidBrush(RowForeColor);RowBackColor = dataGridView.Rows[currentRow].DefaultCellStyle.BackColor;if (RowBackColor.IsEmpty){RowBackBrush = new SolidBrush(dataGridView.DefaultCellStyle.BackColor);RowAlternatingBackBrush = new SolidBrush(dataGridView.AlternatingRowsDefaultCellStyle.BackColor);}else{RowBackBrush = new SolidBrush(RowBackColor);RowAlternatingBackBrush = new SolidBrush(RowBackColor);}CurrentX = (float)leftMargin;if (centerOnPage)CurrentX += (((float)pageWidth – (float)rightMargin – (float)leftMargin) – mColumnPointsWidth[mColumnPoint]) / 2.0F;RowBounds = new RectangleF(CurrentX, currentY, mColumnPointsWidth[mColumnPoint], rowsHeight[currentRow]);if (currentRow % 2 == 0)g.FillRectangle(RowBackBrush, RowBounds);elseg.FillRectangle(RowAlternatingBackBrush, RowBounds);for (int CurrentCell = (int)mColumnPoints[mColumnPoint].GetValue(0); CurrentCell < (int)mColumnPoints[mColumnPoint].GetValue(1); CurrentCell++){if (!dataGridView.Columns[CurrentCell].Visible) continue;if (dataGridView.Columns[CurrentCell].DefaultCellStyle.Alignment.ToString().Contains("Right"))CellFormat.Alignment = StringAlignment.Far;else if (dataGridView.Columns[CurrentCell].DefaultCellStyle.Alignment.ToString().Contains("Center"))CellFormat.Alignment = StringAlignment.Center;elseCellFormat.Alignment = StringAlignment.Near;ColumnWidth = columnsWidth[CurrentCell];RectangleF CellBounds = new RectangleF(CurrentX, currentY, ColumnWidth, rowsHeight[currentRow]);g.DrawString(dataGridView.Rows[currentRow].Cells[CurrentCell].EditedFormattedValue.ToString(), RowFont, RowForeBrush, CellBounds, CellFormat);if (dataGridView.CellBorderStyle != DataGridViewCellBorderStyle.None)g.DrawRectangle(TheLinePen, CurrentX, currentY, ColumnWidth, rowsHeight[currentRow]);CurrentX += ColumnWidth;}currentY += rowsHeight[currentRow];if ((int)currentY > (pageHeight – topMargin – bottomMargin)){currentRow++;return true;}}currentRow++;}currentRow = 0;mColumnPoint++;if (mColumnPoint == mColumnPoints.Count){mColumnPoint = 0;return false;}elsereturn true;}// the main grid printing methodpublic bool DrawDataGridView(Graphics g){try{Calculate(g);DrawHeader(g);bool bContinue = DrawRows(g);return bContinue;}catch (Exception ex){MessageBox.Show("ERROR: " + ex.Message.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}}}}2. 添加PrintDocument控件,,并且绑定PrintPage事件(gridPrinter是全局变量,在下面初始化)

放弃那些不愿放弃的,容忍那些不可容忍的。

Winform将DataGridView导出Excel,调用打印机打印DataGridView

相关文章:

你感兴趣的文章:

标签云: