DataTable 更改在有数据列的类型方法+DataTable 导出excel功能

 /// <summary>
    /// 导出功能
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btn_export_Click(object sender, EventArgs e)
    {
        try
        {
            string strSql = CreateStrWhere();
            DataTable dst = ShDonBLL.GetListForEXport(strSql).Tables[0];
            if (dst.Rows.Count<=0)
            {
                Jscript.Alert(this, "查询数据为空,没有数据导出,请重新选择条件!");
                return;
            }
            DataTable ds = UpdateDataTable(dst);
            for (int i = 0; i < ds.Rows.Count; i++)
            {
                DataColumn dc = ds.Columns[1];//i就是第几列或者用列名也可以
                dc.DataType = typeof(String);
                string eid = ds.Rows[i]["装置名称"].ToString();
                string tyid = ds.Rows[i]["类别"].ToString();
                if (!string.IsNullOrEmpty(eid))
                {
                    ds.Rows[i]["装置名称"] = GetEqui(eid);
                }
                if (!string.IsNullOrEmpty(tyid))
                {
                    ds.Rows[i]["类别"] = GetZG(tyid);
                }
            }
            //DataTableExcel(ds,"测试0","");

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回希望的结果)
    /// </summary>
    /// <param name="argDataTable">数据表DataTable</param>
    /// <returns>数据表DataTable</returns>  

    private DataTable UpdateDataTable(DataTable argDataTable)
    {
        DataTable dtResult = new DataTable();
        //克隆表结构
        dtResult = argDataTable.Clone();
        foreach (DataColumn col in dtResult.Columns)
        {
            if (col.ColumnName == "装置名称" || col.ColumnName == "类别")
            {
                //修改列类型
                col.DataType = typeof(String);
            }
        }
        foreach (DataRow row in argDataTable.Rows)
        {
            DataRow rowNew = dtResult.NewRow();
            rowNew["序号"] = row["序号"];
            rowNew["装置名称"] = row["装置名称"];
            rowNew["停工时间"] = row["停工时间"];
            rowNew["开工时间"] = row["开工时间"];
            rowNew["正常时间"] = row["正常时间"];
            rowNew["停工原因"] = row["停工原因"];
            rowNew["类别"] = row["类别"];
            rowNew["停工时间小时"] = row["停工时间小时"];
            rowNew["年度"] = row["年度"];
            dtResult.Rows.Add(rowNew);
        }
        return dtResult;
    }

    #region  DataTable导出到Excel
    /// <summary>
    /// DataTable导出到Excel
    /// </summary>
    /// <param name="pData">DataTable</param>
    /// <param name="pFileName">导出文件名</param>
    /// <param name="pHeader">导出标题以|分割</param>
    public static void DataTableExcel(System.Data.DataTable pData, string pFileName, string pHeader)
    {
        System.Web.UI.WebControls.DataGrid dgExport = null;
        // 当前对话
        System.Web.HttpContext curContext = System.Web.HttpContext.Current;
        // IO用于导出并返回excel文件
        System.IO.StringWriter strWriter = null;
        System.Web.UI.HtmlTextWriter htmlWriter = null;
        if (pData != null)
        {
            string UserAgent = curContext.Request.ServerVariables["http_user_agent"].ToLower();
            if (UserAgent.IndexOf("firefox") == -1)//火狐浏览器
                pFileName = HttpUtility.UrlEncode(pFileName, System.Text.Encoding.UTF8);
            curContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + pFileName + ".xls");
            curContext.Response.ContentType = "application/vnd.ms-excel";
            strWriter = new System.IO.StringWriter();
            htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
            // 为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的DataGrid
            dgExport = new System.Web.UI.WebControls.DataGrid();
            dgExport.DataSource = pData.DefaultView;
            dgExport.AllowPaging = false;
            dgExport.ShowHeader = true;//显示标题
            dgExport.DataBind();
            string[] arrHeader = pHeader.Split(‘|‘);
            string strHeader = "<table border=\"1\" style=\"background-color:Gray;font-weight:bold;\"><tr>";
            foreach (string j in arrHeader)
            {
                strHeader += "<td>" + j.ToString() + "</td>";
            }
            strHeader += "</tr></table>";
            // 返回客户端
            dgExport.RenderControl(htmlWriter);
            string strMeta = "<meta http-equiv=\"content-type\" content=\"application/ms-excel; charset=UTF-8\"/>";
            curContext.Response.Write(strMeta + strHeader + strWriter.ToString());
            curContext.Response.End();
        }
    }
时间: 2024-08-07 16:35:41

DataTable 更改在有数据列的类型方法+DataTable 导出excel功能的相关文章

项目笔记:导出Excel功能分sheet页插入数据

导出Excel功能分sheet页处理数据: /*导出EXCEL*/ public void createExcel() { log.info("导出Excel功能已经启动-BEGIN"); JxlUtil jsl = new JxlUtil(); List<Device> dataList =new ArrayList<Device>(); List<DeviceExport> list = new ArrayList<DeviceExport

以Table表为框架,在HTML中实现数据列的添加,删除,查找功能

在学习Javascript的过程中,首先遇到的便是对对象数据类型和对象函数的理解不够清晰透彻.这个需要的就只是多实践,写代码的时候仔细脑际每一个变量被赋予的数据类型和对象. 在这次实践中对该Table实现的功能有:隔行变色,列的添加和删除(子节点),鼠标移入移出变色事件,关键字查找,分类具体查找,关键字模糊查找,多关键字查找. 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量的数据同步. □ 线程不安全.数据不同步的做法 class Program { static int sum = 0; static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); Parall

C# 使用Epplus导出Excel [2]:导出动态列数据

上一篇导出excel,是导出已知固定列,有时候我们根本就不知道有几列.列名是什么,因此这些动态列,可以用Dictionary<string,string>接收. 1.实体Student上加上一个字段Dictionarys Student.cs public class Student { public String Name { get; set; } public String Code { get; set; } public Dictionary<string, string>

导出excel时,以form方式提交json数据

今天在写项目时写到一个excel的导出,开始想用ajax请求后台后导出,但发现ajax会有返回值,而且ajax无法直接输出文件,而后台的excel导出方法已经封装好,不方便修改. 就改用了提交的方式form,但form提交,表格分页用的是jquerytable,我需要将一些jquerytable的一些参数传到后台,但这些数据已经是json数据,如果我直接放在input中提交到后台在解析参数会很麻烦,所以就想将json数据转为form方式提交. js //导出 function exportExc

如何正确选择MySQL数据列类型

MySQL数据列类型选择是在我们设计表的时候经常会遇到的问题,下面就教您如何正确选择MySQL数据列类型,供您参考学习. 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性.在选择MySQL数据列类型时,请从以下几个方面考虑: 存放到数据列中的数据类型. 数据值的取值范围. 考虑性能和处理效率. 数值操作比字符操作快. 小类型的处理速度比大类型快. 不同数据表中固定长度类型和可变长度类型的处理效率是不同的. 可变长度类型在经过删除和修改操作后容易产生碎片,降低系统性能,需定期运行O

DataTable 怎样设置列宽? DataTable中已经有数据了怎样在现实的时候设置它的列宽?

首先要理解 DataTable是一个虚拟表,里面存有数据列,既然是虚拟的就不能够为它去设置宽度,如果设置的话可以对其绑定的控件进行设置.例如:绑定的控件对象为DataGridView那么可以这样 datagridview1.datasource = datatable:datagridview1.Column[0].Width = 100;这样就可以将控件上第一列的数据宽设置为100. 1 private void ShowDtails_Click(object sender, EventArg

SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit

使用SqlBulkCopy批量插入,可以快速对大批量的数量插入,性能非常好 在使用时出现“来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit”异常 为DataTable与要插入的数据表字段位置不一样所至 DataTable与要插入的数据表要字段名,位置,数据类型都一至才可 示例,使用使用SqlBulkCopy插入多个表 public bool BatchInsertUniqeCode(DataTable uniqueCodeProduceContrastDt,DataTa

DataSet、DataTable、DataRow的数据复制方法

DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据或者是DataRow的数据,但是只有DataSet和DataTable的复制是支持深层复制的,就是说不仅能复制元素的结构,而且能复制元素的数据,而DatatDataRow没有相关的复制的方法,下面将简单介绍下这些数据元素的复制问题. DataTable sourceTable; DataTable