打印 Excel 模板
大體思路,通過NPOI操作Excel文件,通過Spire將Excel轉成圖片,將圖片傳給系統打印。
Spire是收費工具,在微軟庫中下載Free版本。
#region 打印所用到的函數
private void btnPrint_Click(object sender, EventArgs e)
{
if (!pnlRes.Visible) { MessageBox.Show("請先測量數據!", "提示"); return; } //未測量無法打印
try
{
Settings.PrintDataRead();
if (File.Exists(Settings.path_printExcel))
{
File.Copy(Settings.path_printExcel, Settings.path_printExcelCopy, true);//三個參數分別是源文件路徑,存儲路徑,若存儲路徑有相同文件是否替換
}
writeExcel();
prtDoc.PrinterSettings.PrinterName = Settings.PrintData.PrinterName; //設置打印機名稱
System.Drawing.Printing.PaperSize ps = new System.Drawing.Printing.PaperSize();
//ps.RawKind = 150;
ps.Height = Settings.PrintData.PaperSizeHeight - 5;
ps.Width = Settings.PrintData.PaperSizeWidth + 2;
//ps.PaperName = "default";
prtDoc.DefaultPageSettings.PaperSize = ps;
excelToImage(Settings.path_printExcelCopy);
prtDoc.Print();
cleanAll();
File.Delete(Settings.path_printExcelCopy);
}
catch (Exception ex)
{
LogHelper.Error(ex.GetType(), ex);
MessageBox.Show(ex.Message, "錯誤");
File.Delete(Settings.path_printExcelCopy);
}
}
//寫入信息到Excel
private void writeExcel()
{
try
{
string tempPath = Settings.path_printExcelCopy;
//Excel對象
XSSFWorkbook wk = null;
using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
wk = new XSSFWorkbook(fs);
fs.Close();
}
//Excel頁面 設置->Sheet1
ISheet sheet = wk.GetSheet("Sheet1");
/* 寫入操作 依據需求自己編寫
for (int j = 0; j < chList.Length; ++j)
{
if ((string)chList[j].ckb.Tag != "0")
{
int cell = (j + 1) * 3 - 2;
//寫入通道
sheet.GetRow(1).GetCell(cell).SetCellValue("CH" + (j + 1));
//寫入OK / NG Tag 1,OK 2NG
if ((string)chList[j].ckb.Tag == "1")
{
sheet.GetRow(1).GetCell(cell + 1).SetCellValue("OK");
}
else
{
sheet.GetRow(1).GetCell(cell + 1).SetCellValue("NG");
}
//寫入機型 時間
sheet.GetRow(2).GetCell(cell).SetCellValue("機型:" + Settings.Model.deviceName);
sheet.GetRow(3).GetCell(cell).SetCellValue(DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
for (int i = 0; i < chList[j].lblList.Length; ++i)
{
switch (i)
{
case 0:
sheet.GetRow(4).GetCell(cell).SetCellValue("流量:" + chList[j].lblList[i].Text);
break;
case 1:
sheet.GetRow(5).GetCell(cell).SetCellValue("出口壓力:" + chList[j].lblList[i].Text);
break;
case 2:
sheet.GetRow(6).GetCell(cell).SetCellValue("濃度:" + chList[j].lblList[i].Text);
break;
case 3:
sheet.GetRow(7).GetCell(cell).SetCellValue("霧化壓力:" + chList[j].lblList[i].Text);
break;
}
}
}
else
{
}
}
*/
using (var fs = new FileStream(tempPath, FileMode.Create, FileAccess.Write))
{
wk.Write(fs);
}
}
catch (Exception ex)
{
LogHelper.Error(ex.GetType(), ex);
MessageBox.Show(ex.Message, "錯誤");
}
}
private void excelToImage(string filename)
{
try
{
Workbook workbook = new Workbook();
workbook.LoadFromFile(filename);
Worksheet sheet = workbook.Worksheets[0];
sheet.SaveToImage(Settings.path_printImage); //圖片后綴.bmp ,imagepath自己設置
}
catch (Exception ex)
{
LogHelper.Error(ex.GetType(), ex);
MessageBox.Show(ex.Message, "錯誤");
}
}
private void prtDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
#region 如果不需要截取圖片,可以不用寫以下代碼
//截取左上角寬度
int rectangleWidth = Settings.PrintData.MarginWidth + 72;
int rectangleHight = Settings.PrintData.MarginHeight + 96;
try
{
GC.Collect();
Graphics g = e.Graphics;
//imagepath是指 excel轉成的圖片的路徑
using (Bitmap bitmap = new Bitmap(Settings.path_printImage))
{
Rectangle newarea = new Rectangle();
newarea.X = rectangleWidth;
newarea.Y = rectangleHight;
newarea.Width = bitmap.Width - rectangleWidth;
newarea.Height = bitmap.Height - rectangleHight;
using (Bitmap newbitmap = bitmap.Clone(newarea, bitmap.PixelFormat))
{
//打印
g.DrawImage(newbitmap, 0, 0, newbitmap.Width, newbitmap.Height);
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex.GetType(), ex);
MessageBox.Show(ex.Message, "錯誤");
}
#endregion
}
#endregion