[第三方工具]利用第三方工具xPort导出Excel文件

首先,为什么要用第三方工具

因为各种各样的原因,使用OFFICE导出失败

于是在同事的建议下找了一个第三方工具导出Excel并解决了乱码的问题

发觉网上关于这个工具的用法....很难找到,

于是写在这里,希望对大家有帮助

使用到的第三方工具

VM.xPort.Ds2xl.dll

VM.xPort.ExcelClient.DLL

C#代码如下

<pre name="code" class="csharp">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均为乱码,如果有人看到这篇博文,希望能告知我解决的办法

 <pre name="code" class="csharp">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();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值