首先,为什么要用第三方工具
因为各种各样的原因,使用OFFICE导出失败
于是在同事的建议下找了一个第三方工具导出Excel并解决了乱码的问题
发觉网上关于这个工具的用法....很难找到,
于是写在这里,希望对大家有帮助
使用到的第三方工具
VM.xPort.Ds2xl.dll
VM.xPort.ExcelClient.DLL
C#代码如下
public class ExcelOutPut
{
private static void FormatColumnStyle(VM.xPort.Style oldstyle, DataTable dt, String NewStyleName, String ColumnName, DS2XL _xportToolsDemo)//定义列的风格
{
VM.xPort.Style NewStyle = oldstyle.Clone(NewStyleName, dt.TableName, 0, dt.Columns["" + ColumnName + ""].Ordinal, dt.Rows.Count - 1, dt.Columns["" + ColumnName + ""].Ordinal);
NewStyle.FormatIndex = VM.xPort.Style.xpFormat.Custom;
_xportToolsDemo.Styles.Add(NewStyle);
}
private static void SetColumnWidth(ColWidthCollection widths, string styleName, string dataTableName, int col, int width)// 定义列的宽度
{
SetColumnWidth(widths, styleName, dataTableName, col, col, width);
}
private static void SetColumnWidth(ColWidthCollection widths, string styleName, string dataTableName, int startCol, int endCol, int width)//定义列的宽度
{
ColWidth customColumnWidth = default(ColWidth);
customColumnWidth = new ColWidth(styleName, dataTableName, startCol, endCol, width);
widths.Add(customColumnWidth);
}
public static void ExportDataTableToExcel(DataTable dt)//导出Excel
{
xpOutputFormat outputFormat = default(xpOutputFormat);
MemoryStream exportStream = null;
outputFormat = (xpOutputFormat)Enum.Parse(typeof(xpOutputFormat), "Excel8");//导出的Excel格式
dt.TableName = "BookingInformation";
System.Drawing.Font _customFont = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);//导出的字体格式
VM.xPort.Style _HeaderStyle = default(VM.xPort.Style);
VM.xPort.Style _HeaderStyleRightBorder = default(VM.xPort.Style);
VM.xPort.Style _HeaderStyleLeftBorder = default(VM.xPort.Style);
VM.xPort.Style contentStyle = default(VM.xPort.Style);
DS2XL _xportToolsDemo = new DS2XL();
_HeaderStyle = new VM.xPort.Style("HeaderStyle", dt.TableName, -1, 0, -1, dt.Columns.Count - 1);//表头的样式
_HeaderStyle.Font = _customFont;
_HeaderStyle.HorizontalAlignment = VM.xPort.Style.xpHAlignment.Center;
_HeaderStyle.VerticalAlignment = VM.xPort.Style.xpVAlignment.Center;
_HeaderStyle.TopBorderLine = VM.xPort.Style.xpBorderLineStyle.Double;
_HeaderStyle.BottomBorderLine = VM.xPort.Style.xpBorderLineStyle.Double;
_HeaderStyle.BackgroundColor = System.Drawing.Color.FromArgb(0, 184, 204, 228);
_xportToolsDemo.Styles.Add(_HeaderStyle);
_HeaderStyleRightBorder = _HeaderStyle.Clone("HeaderStyleRightBorder", dt.TableName, -1, dt.Columns.Count - 1, -1, dt.Columns.Count - 1);
_HeaderStyleRightBorder.RightBorderLine = VM.xPort.Style.xpBorderLineStyle.Double;//表头表格边框样式
_xportToolsDemo.Styles.Add(_HeaderStyleRightBorder);
_HeaderStyleLeftBorder = _HeaderStyle.Clone("HeaderStyleLeftBorder", dt.TableName, -1, 0, -1, 0);
_HeaderStyleLeftBorder.LeftBorderLine = VM.xPort.Style.xpBorderLineStyle.Double;//表头表格边框样式
_xportToolsDemo.Styles.Add(_HeaderStyleLeftBorder);
contentStyle = new VM.xPort.Style("ContentStyle", dt.TableName, 0, 0, dt.Rows.Count - 2, dt.Columns.Count - 1);//表格内容 样式
contentStyle.HorizontalAlignment = VM.xPort.Style.xpHAlignment.Center;//水平对齐
contentStyle.VerticalAlignment = VM.xPort.Style.xpVAlignment.Center;//垂直对齐
_xportToolsDemo.Styles.Add(contentStyle);
FormatColumnStyle(contentStyle, dt, "FormatDateStyle", "Date", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatPaymentIDStyle", "PaymentID", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatReceiptStyle", "Receipt", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatName", "Name", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatTel", "Tel", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatEmail", "Email", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatPianoRoom", "PianoRoom", _xportToolsDemo);//列的样式
FormatColumnStyle(contentStyle, dt, "FormatTotalPrice", "TotalPrice", _xportToolsDemo);//列的样式
SetColumnWidth(_xportToolsDemo.ColWidths, "Date", dt.TableName, dt.Columns["Date"].Ordinal, 6000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "PaymentID", dt.TableName, dt.Columns["PaymentID"].Ordinal, 4000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "Receipt", dt.TableName, dt.Columns["Receipt"].Ordinal, 4000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "Name", dt.TableName, dt.Columns["Name"].Ordinal, 4000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "Tel", dt.TableName, dt.Columns["Tel"].Ordinal, 4000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "Email", dt.TableName, dt.Columns["Email"].Ordinal, 5000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "PianoRoom", dt.TableName, dt.Columns["PianoRoom"].Ordinal, 5000);//列的宽度
SetColumnWidth(_xportToolsDemo.ColWidths, "TotalPrice", dt.TableName, dt.Columns["TotalPrice"].Ordinal, 6000);//列的宽度
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";//导出Excel
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + dt.TableName + ".xls");
exportStream = (MemoryStream)_xportToolsDemo.ExportToStream(dt, outputFormat, true);
HttpContext.Current.Response.OutputStream.Write(exportStream.ToArray(), 0, (int)exportStream.Length);
exportStream.Close();
HttpContext.Current.Response.Flush();
dt.Dispose();
}
}
另外,不使用第三方工具直接导出Excel的方法如下
但使用的过程发现有如下问题
1.使用Excel打开导出文件,会弹出警告框
2.导出的Excel有乱码,实际使用时,在简体中文Windows系统使用“GB2312”导出正常
但是在英文Windows系统,无论字符编编码换成“BIG5”,"UTF8"还是"UNICODE"
导出的EXCEL均为乱码,如果有人看到这篇博文,希望能告知我解决的办法
protected void ExcelOutPut_Click(object sender, EventArgs e)
{
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
curContext.Response.Charset = "GB2312";
curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=BookInfo.xls");
string colHeaders = "", ls_item = "";
//生成Datatable
DataTable dt = new DataTable();
dt = ........;
DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
int i = 0;
int cl = dt.Columns.Count;
//取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加\n
{
colHeaders += dt.Columns[i].Caption.ToString() + "\n";
}
else
{
colHeaders += dt.Columns[i].Caption.ToString() + "\t";
}
}
curContext.Response.Write(colHeaders);
//向HTTP输出流中写入取得的数据信息
//逐行处理数据
foreach (DataRow row in myRow)
{
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
for (i = 0; i < cl; i++)
{
if (i == (cl - 1))//最后一列,加\n
{
ls_item += row[i].ToString() + "\n";
}
else
{
ls_item += row[i].ToString() + "\t";
}
}
curContext.Response.Write(ls_item);
ls_item = "";
}
curContext.Response.End();
}