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 print private DataGridView dataGridView; // the PrintDocument private PrintDocument printDocument; // center printout? private bool centerOnPage; // has a title? private bool hasTitle; // title private string title; // font private Font titleFont; // title color private Color titleColor; // use paging? private bool paging; // row printing static int currentRow; // page printing static int pageNumber; // page width private int pageWidth; // page height private int pageHeight; // left margin private int leftMargin; // top margin private int topMargin; // right margin private int rightMargin; // bottom margin private int bottomMargin; // y location placeholder private float currentY; // grid sizes private float rowHeaderHeight; private List<float> rowsHeight; private List<float> columnsWidth; private float dataGridViewWidth; // column stop points private 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 metrics private 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 printing private 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; else TitleFormat.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; else CellFormat.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 function private 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); else g.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; else CellFormat.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; } else return true; } // the main grid printing method public 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是全局变量,在下面初始化)
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { bool more = gridPrinter.DrawDataGridView(e.Graphics); if (more == true) e.HasMorePages = true; }
3. 初始化打印类
private bool InitializePrinting() { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() != DialogResult.OK) return false; printDocument1.DocumentName = "历史信息"; printDocument1.PrinterSettings = printDialog.PrinterSettings; printDocument1.DefaultPageSettings = printDialog.PrinterSettings.DefaultPageSettings; printDocument1.DefaultPageSettings.Margins = new Margins(40, 40, 40, 40); gridPrinter = new GridPrinter(dataGridView1, printDocument1, true, true, "历史信息", new Font("黑体", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Blue, true); return true; }
4. 按钮调用
private void btnPrint_Click(object sender, EventArgs e) { if (InitializePrinting()) { PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); printPreviewDialog.Document = printDocument1; printPreviewDialog.ShowDialog(); } }
时间: 2024-10-26 22:49:31