这个要引用Office组件的几个DLL文件,条件是先安装Office,而且Office要正确安装才可以
正确安装Office组件:http://blog.csdn.net/wxm3630478/article/details/5888375
测试Office版本: Office2007
添加引用 -- Com组件(Tab页) -- Microsoft Excel 12.0 ObjectLibrary -- 因为要向Excel插入图片,所以用Com组件
如果引用 -- .Net组件(Tab页) -- Microsoft.Office.Interop.Excel 版本14.0.0.0 ,则插入图片的方法处会报错,删除即可(如果不需要插入图片)
代码可以参考下,这个是我以前写的一个,是按照公司导出到Excel的格式写的,可以抽取一部分用
你先把数据分好类,放到不同的DataTable中,然后
TableToExcel类有构造函数需要参数 List
这个DataTable集合就会到出到不同的Sheet表,Sheet表的名字就是DataTable的Name属性,
如果Name为空,则是Table1~n
//调用:
List
DataTable table1 = new DataTable();
table1.Name = "鞋类"
dts.Add(table1);
dts.Add(table2);
dts.Add(table3);
//..........
TableToExcel ex = new TableToExcel("C:\\test.xls",dts)
ex.ExportExcel()
/*----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Drawing;
using System.Windows.Forms;
namespace WMS.UI
{
///
/// WXM 2012-04-13创建
///
public class TableToExcel
{
#region 变量
Microsoft.Office.Interop.Excel.Application xlApp = null;
Microsoft.Office.Interop.Excel.Workbooks wbs = null;
Microsoft.Office.Interop.Excel.Workbook wb = null;
private int _rowindex = 0; //全局行索引(使用时加n行)
private int _saveindex = 0; //保存全局行索引(数据导出后还原全局行索引)
//文本
private string _title = String.Empty; //标题
private string _headerdtext = String.Empty; //页眉,即标题的下一行
private string _footertext = String.Empty; //页脚,即最后一行
//正文(列表)是否显示边框
private bool _isalldisplayborder = true;
//正文(列表)边框类型
private BorderWeightType _borderweight = BorderWeightType.xlThin;
//保存路径
private string _savepath = String.Empty;
//字体
private System.Drawing.Font _titlefont = new System.Drawing.Font("宋体", 15);
private System.Drawing.Font _headerfont = new System.Drawing.Font("宋体", 11);
private System.Drawing.Font _footerfont = new System.Drawing.Font("宋体", 11);
private System.Drawing.Font _bodyheaderfont = new System.Drawing.Font("宋体", 11);
private System.Drawing.Font _bodyfont = new System.Drawing.Font("宋体", 11);
//脚文本Align
private TextAlign _drawfootertextalign = TextAlign.xlHAlignRight;
//要导出的表集合
private List _tables = new List();
//设置列宽(_isbodydisplayborder为false)
private Dictionary _columnswidth = new Dictionary();
//设置列的边框,
private Dictionary _columnsborder = new Dictionary();
//保存Table导入到那个Sheet表(打印时可以判断sheet是否有数据,没有数据则不打印)
private Dictionary SheetTable = new Dictionary();
private bool _iswraptext = true; //单元格是否自动换行
private bool _isbodylistheader = true; //是否显示正文列表标题
private bool _isautoconverttext = true; //是否自动转换成文本格式
private bool _isTitleAppendSheetName = false; //标题后面是否追加SheetName
//条码文本
private string _BarCodeText = String.Empty;
//设置打印时页面边距(程序中和Excel中的边距单元不一样(Excel设置0.5大概有5-10px,所以默认5px))
private PaddingF _pageMargin = new PaddingF(5);
private bool _isPrintFooter = true; //是否打印页脚(只跟打印有关)
private string _expandColumnName = String.Empty;
#endregion
#region 构造方法
public TableToExcel(System.Data.DataTable table)
{
_tables = new List() { table };
}
public TableToExcel(List tables)
{
_tables = tables;
}
public TableToExcel(string savepath, System.Data.DataTable table)
{
_savepath = savepath;
_tables = new List() { table };
}
public TableToExcel(string savepath,List tables)
{
_savepath = savepath;
_tables = tables;
}
public TableToExcel(string title, string savepath, System.Data.DataTable table)
{
_savepath = savepath;
Title = title;
_tables = new List() { table };
}
public TableToExcel(string title, string savepath, List tables)
{
_savepath = savepath;
Title = title;
_tables = tables;
}
#endregion
#region 属性
///
/// 行索引(表示从某行开始打印,如0表示从第一行开始)
///
public virtual int RowIndex
{
get { return _rowindex; }
set
{
_rowindex = _saveindex = value;
}
}
///
/// 标题
///
public virtual string Title
{
get { return _title; }
set
{
_title = value;
IsDrawTitle = !string.IsNullOrEmpty(value);
}
}
///
/// 头文本
///
public virtual string HeaderText
{
get { return _headerdtext; }
set
{
_headerdtext = value;
IsDrawHeader = !string.IsNullOrEmpty(value);
}
}
///
/// 脚文本
///
public virtual string FooterText
{
get { return _footertext; }
set
{
_footertext = value;
IsDrawFooter = !string.IsNullOrEmpty(value);
}
}
///
/// 保存地址
///
public virtual string SavePath
{
get { return _savepath; }
set
{
_savepath = value;
}
}
///
/// 标题字体
///
public virtual System.Drawing.Font TitleFont
{
get { return _titlefont; }
set { _titlefont = value; }
}
///
/// Header字体
///
public virtual System.Drawing.Font HeaderFont
{
get { return _headerfont; }
set { _headerfont = value; }
}
///
/// 页脚字体
///
public virtual System.Drawing.Font FooterFont
{
get { return _footerfont; }
set { _footerfont = value; }
}
///
/// 正文标题字体
///
public virtual System.Drawing.Font BodyHeaderFont
{
get { return _bodyheaderfont; }
set { _bodyheaderfont = value; }
}
///
/// 正文字体
///
public virtual System.Drawing.Font BodyFont
{
get { return _bodyfont; }
set { _bodyfont = value; }
}
///
/// 导出表集合
///
public virtual List Tables
{
get { return _tables; }
set { _tables = value; }
}
///
/// 列宽集合(A:A 表示第一列,A:B表示第一二列)
///
public virtual Dictionary ColumnsWidth
{
get { return _columnswidth; }
set { _columnswidth = value; }
}
///
/// 那些列显示边框
///
public virtual Dictionary ColumnsBorder
{
get { return _columnsborder; }
set { _columnsborder = value; }
}
public virtual bool IsDrawTitle { get; set; }
public virtual bool IsDrawHeader { get; set; }
public virtual bool IsDrawFooter { get; set; }
public virtual TextAlign DrawFooterTextAlign
{
get { return _drawfootertextalign; }
set { _drawfootertextalign = value; }
}
///
/// 是否显示数据列表标题
///
public virtual bool IsBodyListHeader
{
get { return _isbodylistheader; }
set { _isbodylistheader = value; }
}
///
/// 正文(列表)是否显示边框
///
public virtual bool IsDispalyBorderAll
{
get { return _isalldisplayborder; }
set { _isalldisplayborder = value; }
}
///
/// 是否自动转换成文本格式
///
public virtual bool IsAutoConvertText
{
get { return _isautoconverttext; }
set
{
_isautoconverttext = value;
}
}
///
/// 标题后面是否追加SheetName
///
public virtual bool IsTitleAppendSheetName
{
get { return _isTitleAppendSheetName; }
set
{
_isTitleAppendSheetName = value;
}
}
///
/// 正文(列表)边框类型
///
public virtual BorderWeightType BorderWeight
{
get { return _borderweight; }
set { _borderweight = value; }
}
///
/// 单元格是否自动适应宽度
///
public virtual bool IsAutoFit { get; set; }
///
/// 单元格是否自动换行
///
public virtual bool IsWrapText
{
get { return _iswraptext; }
set { _iswraptext = value; }
}
///
/// 条码文本(长度不能超过8位,超过8位请更新图片模版,否则打印出界)
///
public string BarCodeText
{
get { return _BarCodeText; }
set
{
_BarCodeText = value;
if (!String.IsNullOrEmpty(value))
{
IsDrawTitle = true;
}
else
{
IsDrawTitle = !string.IsNullOrEmpty(_title);
}
}
}
///
/// 设置打印时页面边距(程序中和Excel中的边距单元不一样(Excel设置0.5大概有10px,所以默认10px))
///
public PaddingF PageMargin
{
get { return _pageMargin; }
set
{
_pageMargin = value;
}
}
///
/// 是否打印页脚(只跟打印有关)
///
public bool IsPrintFooter
{
get { return _isPrintFooter; }
set
{
_isPrintFooter = value;
}
}
///
/// 要扩大的列(打印时,如果设置了列宽自动适应,有可能总列宽缩小或放大,所以缩小或放大的宽度要算在ExpandColumnName列上)
/// 格式 A:A B:B C:C
///
public string ExpandColumnName
{
get { return _expandColumnName; }
set { _expandColumnName = value; }
}
#endregion
public void ExportExcel()
{
if (string.IsNullOrEmpty(_savepath))
{
throw new Exception("保存路径不能为空!");
}
try
{
Microsoft.Office.Interop.Excel.Workbook wb = GetExcelWorkbook();
//保存工作表
wb.SaveCopyAs(_savepath);
}
catch(Exception ex)
{
throw ex;
}
finally
{
Close();
}
}
///
/// 打印Excel (打印设置列宽不能出现E:F)
///
/// 是否所有Sheet横向打印(true为横向打印)
public void PrintExcel(bool isLandscape)
{
try
{
Microsoft.Office.Interop.Excel.Workbook wb = GetExcelWorkbook();
if (wb == null)
{
return;
}
foreach (var v in wb.Worksheets)
{
try
{
Microsoft.Office.Interop.Excel.Worksheet wsheet = ((Microsoft.Office.Interop.Excel.Worksheet)v);
//无数据表无需打印
if (SheetTable[wsheet.Name].Rows.Count > 0)
{
if (isLandscape)
{
//设置横向打印,默认纵向
wsheet.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlLandscape; //横向打印
}
//设置纸张类型
wsheet.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4;
//设置打印边距
wsheet.PageSetup.TopMargin = _pageMargin.Top;
wsheet.PageSetup.BottomMargin = _isPrintFooter ? 12.00 : _pageMargin.Bottom;
wsheet.PageSetup.LeftMargin = _pageMargin.Left;
wsheet.PageSetup.RightMargin = _pageMargin.Right;
//wsheet.PageSetup.CenterHorizontally = true;
//wsheet.PageSetup.CenterVertically = true; //这2句是居中打印
//wsheet.PageSetup.CenterFooter = "&\"Arial\"&12 " + obj.pageid.ToString();//页脚字体和大小
wsheet.PageSetup.FooterMargin = 1;
if (_isPrintFooter)
{
//打印页脚
wsheet.PageSetup.LeftFooter = wsheet.Name;
wsheet.PageSetup.CenterFooter = @"第 &P 页/共 &N 页";
wsheet.PageSetup.RightFooter = "打印时间:" + DateTime.Now.ToString();
}
//列宽自适应 (中英文数字混排的时候,如果不设置自动适应列宽的话,有的时候打印会缺字)
wsheet.Columns.AutoFit();
if (!String.IsNullOrEmpty(_expandColumnName)) //如果有扩大的列
{
float swidth = 0; //目前实际宽度
float ywidth = 0; //应该显示的宽度
foreach (var vk in _columnswidth)
{
object obj = ((Microsoft.Office.Interop.Excel.Range)wsheet.Columns[vk.Key, Type.Missing]).ColumnWidth;
swidth += float.Parse(obj.ToString());
ywidth += vk.Value; //设置的列宽总和
}
//自适应宽度后,总宽度小于我打印时设置的总宽度,则把缩小的宽度添加到可以扩大的列上
//扩大某列的宽度
Microsoft.Office.Interop.Excel.Range colrange = (Microsoft.Office.Interop.Excel.Range)wsheet.Columns[_expandColumnName, Type.Missing];
float cwidth = float.Parse(colrange.ColumnWidth.ToString()); //列当前宽度
if (swidth < ywidth)
{
colrange.ColumnWidth = (cwidth + (ywidth - swidth));
}
else
{
colrange.ColumnWidth = (cwidth - (swidth - ywidth));
}
}
//自适应行
wsheet.Rows.AutoFit();
//打印
wsheet.PrintOutEx();
}
}
catch
{ }
}
//打印整个Workbook(所有Sheet表都打印出来)
//wb.PrintOutEx();
}
catch (Exception ex)
{
throw ex;
}
finally
{
Close();
}
}
///
/// 打印Excel 默认纵向打印
///
public void PrintExcel()
{
PrintExcel(false);
}
///
/// 获取Workbook
///
///
///
public Microsoft.Office.Interop.Excel.Workbook GetExcelWorkbook()
{
if (_tables.Count == 0)
{
throw new Exception("Tables集合必须大于零!");
}
if (_rowindex < 0)
{
_rowindex = 0;
}
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = false;
xlApp.DisplayAlerts = false;
wbs = xlApp.Workbooks;
wb = wbs.Add(Missing.Value); //添加一个工作簿
//添加Sheet表,新建一个Excel文件时候,一般会默认有3个Sheet表,所以用[table.Count - wb.Sheets.Count]
int tabcount = _tables.Count;
int sheets = wb.Worksheets.Count; //获取默认Sheet表个数,一般默认3个
if (tabcount > sheets)
{
wb.Worksheets.Add(Missing.Value, Missing.Value, tabcount - sheets, Missing.Value);
}
//删除多余Sheet表
//((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[index]).Delete();
//写入Excel
WriteExcelSheet(wb);
//保存工作表
//xlApp.ActiveWorkbook.SaveCopyAs(filename);
//wb.SaveCopyAs(_savepath);
return wb;
}
private void Close()
{
#region 关闭Excel进程
if (wb != null)
{
wb.Close(false, _savepath, Missing.Value);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
wb = null;
}
if (wbs != null)
{
wbs.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
wbs = null;
}
if (xlApp != null)
{
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlApp = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
#endregion
}
///
/// 写入Excel的Sheet表
///
///
///
private void WriteExcelSheet(Microsoft.Office.Interop.Excel.Workbook wb)
{
List SheetNames = GetSheetsName(wb); //Sheet表名字集合,防止相同名称,出现错误!
for (int i = 0; i < _tables.Count; i++)
{
System.Data.DataTable table = _tables[i];
int rows = table.Rows.Count;
int cols = table.Columns.Count;
//获取Sheet表
Microsoft.Office.Interop.Excel.Worksheet wsheet = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[i + 1]; //wb.Worksheets 所以从1开始
//选中表
wsheet.Select();
//设置表名字
wsheet.Name = GetCorrectSheetName(SheetNames, table.TableName, (i + 1)); //Name要特别注意
//保存DataTable和Sheet表的绑定
SheetTable.Add(wsheet.Name, table);
//设置总标题
DrawTitle(wsheet, cols);
//设置HeaderText
if (IsDrawHeader)
{
DrawText(wsheet, _headerdtext, _headerfont, TextAlign.xlHAlignLeft, cols);// Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft, cols);
}
//数据列表标题
//Microsoft.Office.Interop.Excel.Range r = ret.get_Range(ret.Cells[1, 1], ret.Cells[1, table.Columns.Count]);
if (_isbodylistheader)
{
_rowindex++;
Microsoft.Office.Interop.Excel.Range range = wsheet.Range[wsheet.Cells[_rowindex, 1], wsheet.Cells[_rowindex, cols]];
object[] header = new object[cols];
for (int j = 0; j < cols; j++)
{
header[j] = table.Columns[j].ToString();
}
range.Value2 = header;
SetFont(range, _bodyheaderfont);
if (_isalldisplayborder)
{
range.Borders.LineStyle = 1; //边框线
range.Borders.Weight = (int)_borderweight;
}
}
if (rows > 0)
{
_rowindex++;
Microsoft.Office.Interop.Excel.Range range = wsheet.get_Range("A" + _rowindex, Missing.Value);
object[,] objData = new Object[rows, cols];
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
string converttxt = String.Empty;
if (_isautoconverttext)
{
converttxt = "'";
}
objData[row, col] = converttxt + table.Rows[row][col].ToString(); //随后数据后面加单引号
}
}
range = range.get_Resize(rows, cols);
range.Value2 = objData;
SetFont(range, _bodyfont);
if (_isalldisplayborder)
{
range.Borders.LineStyle = 1; //加线框
range.Borders.Weight = (int)_borderweight;
}
else
{
//((Microsoft.Office.Interop.Excel.Range)range.Columns["A:A", Type.Missing]).Borders.LineStyle = 1;
//((Microsoft.Office.Interop.Excel.Range)range.Columns["A:A", Type.Missing]).Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlMedium;
//指定的列显示边框
foreach (var vk in _columnsborder)
{
Microsoft.Office.Interop.Excel.Borders borders = ((Microsoft.Office.Interop.Excel.Range)range.Columns[vk.Key, Type.Missing]).Borders;
borders.LineStyle = 1;
borders.Weight = (int)vk.Value;
}
}
if (IsAutoFit)
{
range.EntireColumn.AutoFit(); //自动适应列
}
//更新行索引
_rowindex += (rows - 1);
}
//设置FooterText
if (IsDrawFooter)
{
if (rows == 0)
{
_rowindex += 2; //与Body隔一行
}
DrawText(wsheet, _footertext, _footerfont,DrawFooterTextAlign, cols);
}
//所有列自动换行
wsheet.Columns.WrapText = _iswraptext;
//设置列宽
if (!IsAutoFit)
{
foreach (var vk in _columnswidth)
{
((Microsoft.Office.Interop.Excel.Range)wsheet.Columns[vk.Key, System.Type.Missing]).ColumnWidth = vk.Value;
}
}
//保存名字
SheetNames.Add(wsheet.Name);
//还原
_rowindex = _saveindex;
}
//选中第一个表
((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1]).Select();
}
///
/// 写标题
///
///
///
///
private void DrawTitle(Microsoft.Office.Interop.Excel.Worksheet wsheet, int colcount)
{
if (!IsDrawTitle)
{
return;
}
_rowindex++; //加行数
Microsoft.Office.Interop.Excel.Range cellrange = (Microsoft.Office.Interop.Excel.Range)wsheet.Cells[_rowindex, 1];
//cellrange.RowHeight = 31; //行高31
//插入图片
InsertImage(GetImagePath(), cellrange, wsheet);
//取得整个报表的标题
string titletxt = _title;
if (_isTitleAppendSheetName)
{
titletxt += "(" + wsheet.Name + ")";
}
wsheet.Cells[_rowindex, 1] = titletxt;
//设置整个报表的标题格式
Microsoft.Office.Interop.Excel.Range range = wsheet.Range[wsheet.Cells[_rowindex, 1], wsheet.Cells[_rowindex, colcount]];
//设置字体
SetFont(range, _titlefont);
//range.Borders.LineStyle = 1; //边线框
//下边框线
Microsoft.Office.Interop.Excel.Border border = range.Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom);
//border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlSlantDashDot;// 选择先的类型
border.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlMedium;
//字体剧中
range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenterAcrossSelection;
//合并单元格
range.Merge(range.MergeCells);
range.WrapText = true;
}
///
/// 写文本
///
///
///
///
private void DrawText(Microsoft.Office.Interop.Excel.Worksheet wsheet, string txt,System.Drawing.Font font,TextAlign align, int colcount)
{
_rowindex++;
//取得整个报表的标题
wsheet.Cells[_rowindex, 1] = txt;
//设置整个报表的标题格式
Microsoft.Office.Interop.Excel.Range range = wsheet.Range[wsheet.Cells[_rowindex, 1], wsheet.Cells[_rowindex, colcount]];
SetFont(range, font);
//range.Borders.LineStyle = 1; //边线
range.HorizontalAlignment = (int)align; // Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
//合并单元格
range.Merge(range.MergeCells);
}
///
/// 插入图片方法
///
///
///
///
private void InsertImage(string imgpath, Microsoft.Office.Interop.Excel.Range range, Microsoft.Office.Interop.Excel.Worksheet wsheet)
{
if (System.String.IsNullOrEmpty(imgpath))
{
return;
}
try
{
//126
range.Select();
float PicLeft, PicTop;
PicLeft = Convert.ToSingle(range.Left);
PicTop = Convert.ToSingle(range.Top) + 1.5F;
wsheet.Shapes.AddPicture(imgpath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, -1, -1); //-1表示用源图尺寸
}
catch { }
}
///
/// 设置字体
///
///
///
private void SetFont(Microsoft.Office.Interop.Excel.Range range, System.Drawing.Font font)
{
range.Font.Bold = font.Bold;
range.Font.Italic = font.Italic;
range.Font.Name = font.Name;
range.Font.Size = font.Size;
range.Font.Underline = font.Underline;
}
///
/// 获取Workbook中所有Sheet表的名称
///
///
///
private List GetSheetsName(Microsoft.Office.Interop.Excel.Workbook wb)
{
List names = new List();
foreach (var sheet in wb.Worksheets)
{
string name = ((Microsoft.Office.Interop.Excel.Worksheet)sheet).Name;
if (!String.IsNullOrEmpty(name))
{
names.Add(name);
}
}
return names;
}
///
/// 获取一个合法Sheet名称
///
///
private string GetCorrectSheetName(List existnames, string tabname, int tabindex)
{
string name = String.Empty;
//是否为空,是否大于31,是否有特殊字符
//验证名字是否合法
if (!VerifySheetName(tabname))
{
tabname = "Table" + tabindex;
}
bool isexist = existnames.Exists(n => n.Equals(tabname)); //是否存在
if (isexist)
{
tabindex++;
name = GetCorrectSheetName(existnames, "Table" + tabindex, tabindex);
}
else
{
name = tabname;
}
return name;
}
///
/// 判断是否合法
///
private bool VerifySheetName(string sheetname)
{
if (string.IsNullOrEmpty(sheetname) || sheetname.Length > 31)
{
return false;
}
if (sheetname.Contains("\\") || sheetname.Contains("/"))
{
return false;
}
if (sheetname.Contains(":") || sheetname.Contains(":"))
{
return false;
}
if (sheetname.Contains("?") || sheetname.Contains("?"))
{
return false;
}
if (sheetname.Contains("[") || sheetname.Contains("]"))
{
return false;
}
return true;
}
///
/// 保存图片到本地,并返回图片地址
///
///
public string GetImagePath()
{
if (String.IsNullOrEmpty(BarCodeText))
{
return String.Empty;
}
string imgpath = String.Empty;
Bitmap bitmap = null;
Graphics gs = null;
try
{
bitmap = WMS.UI.Properties.Resources.BarCode_Template;
gs = Graphics.FromImage(bitmap); //获取模版图片的Graphics对象
BarCode39 barcode = new BarCode39();
barcode.BarcodeText = BarCodeText; //分拣单编号
barcode.DrawBarBit(gs, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); //条码画到模版图片上
imgpath = Application.StartupPath + "\\BarCode.jpg";
bitmap.Save(imgpath); //保存图片
}
catch
{
imgpath = "";
}
finally
{
if (gs != null)
{
gs.Dispose();
gs = null;
}
if (bitmap != null)
{
bitmap.Dispose();
bitmap = null;
}
}
return imgpath;
}
}
public enum BorderWeightType
{
///
/// 中
///
xlMedium = -4138,
///
/// 极细
///
xlHairline = 1,
///
/// 细
///
xlThin = 2,
///
/// 粗
///
xlThick = 4,
}
public enum BorderLineStyle
{
///
/// 无
///
xlLineStyleNone = -4142,
///
/// 双划线
///
xlDouble = -4119,
///
/// 点线
///
xlDot = -4118,
///
/// 划线
///
xlDash = -4115,
///
/// 连续线
///
xlContinuous = 1,
///
/// 点划线
///
xlDashDot = 4,
///
/// 双点的划线
///
xlDashDotDot = 5,
///
/// 倾斜点划线
///
xlSlantDashDot = 13,
}
public enum TextAlign
{
xlHAlignRight = -4152,
xlHAlignLeft = -4131,
xlHAlignJustify = -4130,
xlHAlignDistributed = -4117,
xlHAlignCenter = -4108,
xlHAlignGeneral = 1,
xlHAlignFill = 5,
xlHAlignCenterAcrossSelection = 7,
}
public struct PaddingF
{
double _Left;
double _Right;
double _Top;
double _Bottom;
public PaddingF(double all)
{
this._Left = all;
this._Right = all;
this._Top = all;
this._Bottom = all;
}
public PaddingF(double left, double top, double right, double bottom)
{
this._Left = left;
this._Right = right;
this._Top = top;
this._Bottom = bottom;
}
public void SetValue(double all)
{
SetValue(all, all, all, all);
}
public void SetValue(double top, double left, double right, double bottom)
{
this._Left = left;
this._Right = right;
this._Top = top;
this._Bottom = bottom;
}
public double Left
{
get { return _Left; }
set
{
_Left = value;
}
}
public double Right
{
get { return _Right; }
set
{
_Right = value;
}
}
public double Top
{
get { return _Top; }
set
{
_Top = value;
}
}
public double Bottom
{
get { return _Bottom; }
set
{
_Bottom = value;
}
}
}
#region BarCode 条形码
public class BarCode39
{
public string BarcodeText = string.Empty;
public int BarcodeHeight = 0;
public int BarcodeWidth = 0;
public Font footerFont = new Font("微软雅黑", 13.0f); /*Bob 修改了字体大小*/
private double wideToNarrowRatio = 3.0;
public double WideToNarrowRatio
{
get { return wideToNarrowRatio; }
set { wideToNarrowRatio = value; }
}
private int weight = 1;
public int Weight
{
get { return weight; }
set { weight = value; }
}
///
/// 39条码中能使用的字符
///
private String alphabet39 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";
#region
private String[] coded39Char =
{
/* 0 */ "001100100",
/* 1 */ "100010100",
/* 2 */ "010010100",
/* 3 */ "110000100",
/* 4 */ "001010100",
/* 5 */ "101000100",
/* 6 */ "011000100",
/* 7 */ "000110100",
/* 8 */ "100100100",
/* 9 */ "010100100",
/* A */ "100010010",
/* B */ "010010010",
/* C */ "110000010",
/* D */ "001010010",
/* E */ "101000010",
/* F */ "011000010",
/* G */ "000110010",
/* H */ "100100010",
/* I */ "010100010",
/* J */ "001100010",
/* K */ "100010001",
/* L */ "010010001",
/* M */ "110000001",
/* N */ "001010001",
/* O */ "101000001",
/* P */ "011000001",
/* Q */ "000110001",
/* R */ "100100001",
/* S */ "010100001",
/* T */ "001100001",
/* U */ "100011000",
/* V */ "010011000",
/* W */ "110001000",
/* X */ "001011000",
/* Y */ "101001000",
/* Z */ "011001000",
/* - */ "000111000",
/* . */ "110000100",
/*' '*/ "011000100",
/* $ */ "010101000",
/* / */ "010100010",
/* + */ "010001010",
/* % */ "100101000",
/* * */ "001101000"
};
#endregion
public BarCode39()
{
BarcodeText = "1234";
}
///
/// 为了使得条形码居中先要计算条形码的Left和Top坐标
///
///
private int getX()
{
int currentLocation = 0;
string strBarcode = "*" + BarcodeText.ToUpper() + "*";
for (int i = 0; i < strBarcode.Length; i++)
{
string encodedString = coded39Char[alphabet39.IndexOf(strBarcode[i])];
for (int j = 0; j < 5; j++)
{
if (encodedString[j] == '0')
{
currentLocation += weight;
}
else
{
currentLocation += 3 * weight;
}
//画第6个 5 白条
if ((j + 5) < 9)
{
if (encodedString[j + 5] == '0')
{
currentLocation += weight;
}
else
{
currentLocation += 3 * weight;
}
}
}
currentLocation += weight;
}
return currentLocation;
}
///
/// 显示条形码
///
/// GDI+
/// 画图区域
protected void DrawBitmap(Graphics g, Rectangle rects)
{
if (BarcodeText == "") return;
string strBarcode = "*" + BarcodeText.ToUpper() + "*";
//string strBarcode = BarcodeText.ToUpper() ;
String encodedString = "";
int currentLocation = 5;//rects.X + (rects.Width - getX()) / 2;
SolidBrush blackBrush = new SolidBrush(Color.Black);
SolidBrush witeBrush = new SolidBrush(Color.White);
int yTop = rects.Y;
for (int i = 0; i < strBarcode.Length; i++)
{
encodedString = coded39Char[alphabet39.IndexOf(strBarcode[i])];
for (int j = 0; j < 5; j++)
{
if (encodedString[j] == '0')
{
Rectangle re1 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
g.FillRectangle(blackBrush, re1);
currentLocation += weight;
}
else
{
Rectangle re1 = new Rectangle(currentLocation, yTop, 3 * weight, BarcodeHeight);
g.FillRectangle(blackBrush, re1);
currentLocation += 3 * weight;
}
//画第6个 5 白条
if ((j + 5) < 9)
{
if (encodedString[j + 5] == '0')
{
Rectangle re1 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
g.FillRectangle(witeBrush, re1);
currentLocation += weight;
}
else
{
Rectangle re1 = new Rectangle(currentLocation, yTop, 3 * weight, BarcodeHeight);
g.FillRectangle(witeBrush, re1);
currentLocation += 3 * weight;
}
}
}
Rectangle re2 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
g.FillRectangle(witeBrush, re2);
currentLocation += weight;
}
}
///
/// 显示条形码和文字
///
///
///
public void DrawBarcode(Graphics g, Rectangle rects)
{
SizeF fsize = g.MeasureString(BarcodeText, this.footerFont);
Rectangle b = rects;
b.Y = rects.Y + rects.Height - (int)fsize.Height;
b.X = rects.X + (rects.Width - (int)fsize.Width) / 2;
b.Height = (int)fsize.Height;
DrawText(BarcodeText, g, b);
//BarCode
Rectangle m = new Rectangle();
m = rects;
m.Height = rects.Height - b.Height;
this.BarcodeHeight = m.Height;
DrawBitmap(g, m);
}
///
/// 绘制条形码 无文字
///
///
///
public void DrawBarBit(Graphics g, Rectangle rects)
{
SizeF fsize = g.MeasureString(BarcodeText, this.footerFont);
Rectangle b = rects;
b.Y = rects.Y + rects.Height - (int)fsize.Height;
b.X = rects.X + (rects.Width - (int)fsize.Width) / 2;
b.Height = (int)fsize.Height;
//DrawText(BarcodeText, g, b);
//BarCode
Rectangle m = new Rectangle();
m = rects;
//m.Height = rects.Height - b.Height;
this.BarcodeHeight = m.Height;
DrawBitmap(g, m);
}
///
/// 文本显示
///
///
///
///
protected void DrawText(string text, Graphics g, Rectangle rects)
{
g.DrawString(text, this.footerFont, Brushes.Black, rects);
}
}
#endregion
}