C#DataTable操作技巧

1 数据列操作

1.1 向指定位置添加列

	/*
	 * dt数据列结构(dt的结构为:姓名,班级,成绩)
	 * 添加序号列,列序号为:0
	 * 操作结果:dt的结构为:序号,姓名,班级,成绩
	 */
	dt.Columns.Add("序号").SetOrdinal(0);

2.1 移动指定列的位置(数据跟随移动)

	/*
	 * dt数据列结构(dt的结构为:序号,姓名,班级,成绩)
	 * 移动列:成绩 => 班级前
	 * 移动结果:dt的结构为:序号,姓名,成绩,班级
	 */
	 dt.Columns["成绩"].SetOrdinal(2);

2 数据获取

2.1 获取数据列

   //数据“ID”列转为List集合:列名:ID 数据类型:int  转换为:List<int>
   List<int> lstByIndex = dt.AsEnumerable().Select(it => it.Field<int>(0)).ToList();
   List<int> lstByName = dt.AsEnumerable().Select(it => it.Field<int>("ID")).ToList();

   //数据“value”列转为数组:列名:value 数据类型:string  转换为:double数组  
   double[] dArray = dt.AsEnumerable().Select(d => Convert.ToDouble(d.Field<string>("value"))).ToArray();

2.2 获取数据行

   List<object> lstObj = dt.Rows[0].ItemArray.ToList();

3 添加表2(结构和数据)至表1

   /// <summary>
   /// 合并表(向表1增加表2的结构和数据)
   /// </summary>
   /// <param name="t1">表1</param>
   /// <param name="t2">表2</param>
   private DataTable MergeTable(DataTable t1, DataTable t2)
   {
       try
       {
           //向表1添加表2数据列结构
           foreach (DataColumn col in t2.Columns)
           {
               t1.Columns.Add(col);
           }

           //向表1添加表2中的而所有列的数据
           int nCountT2 = t2.Rows.Count;      //获取表2总行数
           int firstCell = t1.Columns.Count;   //获取表的总列数
           int secondCell = t2.Columns.Count;   //获取表2的总列数

           //控制行循环
           for (int i = 0; i < nCountT2; i++)
           {
               //控制列循环
               for (int j = 0; j < secondCell; j++)
               { 
                   t1.Rows[i][firstCell + j] = t2.Rows[i][j];
               }
           }

           return t1;
       }
       catch(Exception ex)
       {
           throw new Exception(ex.Message);
       }
   }

4. DataTable => Excle之NPOI

4.1 添加NPOI

① 在打开的C#项目中,右击项目名称→管理Nuget程序包(N)→等待加载完成→在“搜索联机”中搜索NPOI→点击安装→等待安装完成,

② 包管理器无法使用时,直接在项目中添加引用—浏览NPOI的dll文件—添加

注:NPOI的dll文件可从其他项目中copy

4.2 单表导出

/// <summary>
/// 导出单个DataTable→Excel
/// </summary>
/// <param name="data">DataTable对象</param>
/// <param name="sheetName">接收Excel的sheet的名称</param>
/// <param name="filename">接收文件名</param>
/// <returns>导入数据行数(包含列名那一行)</returns>
public int DataTableToExcel(DataTable data, string sheetName, string filename)
{
    int count = 0;//控制返回状态,以及标记导出数据行
    IWorkbook workbook = null;
    FileStream fs = null;//创建文件流对象
    ISheet sheet = null;//工作表对象
    bool isColumnWritten = true;//设置列名是否导入

    #region 打开保存文件对话框,设置对话框属性,导出数据
    SaveFileDialog dialog = new SaveFileDialog();//创建保存文件对象
    dialog.Title = "请选择文件保存路径";//打开文件对话框标题设置为:请选择文件保存路径
    dialog.Filter = "Excel(*.xls)|*.xls|Excel(*.xlsx)|*.xlsx";//只显示Excel文件
    dialog.FileName = filename;//传入默认文件名(已经设置好的文件名)
    if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) //打开文件对话框,点击确定时运行以下代码
    {
        filename = dialog.FileName;//接收重新命名的文件名

        #region 设置工作部数据,导出数据,确定文件导出状态
        try
        {
            fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);//文件流对象实例化,传入文件保存全路径,文件打开权限,文件读写权限

            #region 1.创建工作薄
            if (filename.IndexOf(".xlsx") > 0) // 2007版本(判断文件路径中是否包含".xlsx",确定为Excel那个版本)
                workbook = new XSSFWorkbook();
            else if (filename.IndexOf(".xls") > 0) // 2003版本(判断文件路径中是否包含".xlsx",确定为Excel那个版本)
                workbook = new HSSFWorkbook();
            #endregion

            #region 2.创建工作表
            if (workbook != null)//工作簿是否创建成功?创建工作表:返回(三目运算表达)
            {
                sheet = workbook.CreateSheet(sheetName);//传入工作表名称,并创建工作表
            }
            else
            {
                return -1;//返回值为-1时,则表示导出失败
            }
            #endregion

            #region 3.导出列名
            if (isColumnWritten) //控制列名是否导出bool对象:isColumnWritten
            {
                IRow row = sheet.CreateRow(0);//创建一行数据
                for (int j = 0; j < data.Columns.Count; j++)//
                {
                    row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
                }
                count = 1;
            }
            else
            {
                count = 0;
            }
            #endregion

            #region 4.设置导出文件的列宽
            for (int columnWidth = 0; columnWidth < 10; columnWidth++)
            {
                sheet.SetColumnWidth(columnWidth, 15 * 256);
            }
            #endregion

            #region 5.导出数据
            Type type;//创建保存数据类型对象

            //创建CellStyle与DataFormat并加载格式样式
            IDataFormat dataformat = workbook.CreateDataFormat();
            ICellStyle style = workbook.CreateCellStyle();
            //style.DataFormat = dataformat.GetFormat("0.00"); //改变小数精度【小数点后有几个0表示精确到小数点后几位】  

            // 循环数据表行
            for (int i = 0; i < data.Rows.Count; i++)
            {

                IRow row = sheet.CreateRow(count);
                row.Height = 20 * 20;//设置行高

                #region 循环导出数据列
                for (int j = 0; j < data.Columns.Count; j++)//
                {
                    try
                    {
                        type = data.Rows[i][j].GetType();//获取数据类型
                        //Debug.WriteLine(type);//打印数据类型

                        #region 根据当前单元格数据类型写入数据
                        if (type == typeof(string))
                        {
                            row.CreateCell(j).SetCellValue(Convert.ToDouble(data.Rows[i][j]));
                        }
                        else if (type == typeof(int))
                        {
                            row.CreateCell(j).SetCellValue(Convert.ToInt32(data.Rows[i][j]));
                        }
                        else if (type == typeof(double))
                        {
                            row.CreateCell(j).SetCellValue(Math.Round(Convert.ToDouble(data.Rows[i][j]), 4));
                        }
                        else if (type == typeof(Single))
                        {
                            row.CreateCell(j).SetCellValue(Math.Round(Convert.ToSingle(data.Rows[i][j]), 4));
                        }
                        else
                        {
                            row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                        }
                        #endregion

                    }
                    catch (Exception)
                    {
                        //如果获取的数据类型出错则将数据对象转换为string类型导出
                        row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                    }
                }
                #endregion

                ++count;
            }
            #endregion

            #region 6.将文件流对象写入Excel,释放文件权限资源,并返回
            workbook.Write(fs); //写入到excel
            fs.Dispose();//释放资源
            return count;
            #endregion
        }
        catch (Exception ex)
        {
            MessageBox.Show("导出文件时出错!\n", "提示");
            //Console.WriteLine("导出文件时出错,文件可能正被打开!\n" + ex.Message);
            return -1;
        }
        #endregion
    }
    else
        return -1;
    #endregion
}


4.3 多表导出

/// <summary>
/// 导出多个DataTable→excel中
/// </summary>
/// <param name="data">要导入的数据</param>
/// <param name="isColumnWritten">DataTable的列名是否要导入</param>
/// <param name="sheetName">要导入的excel的sheet的名称</param>
/// <param name="filePath">获取文件路径</param>
/// <returns>导入数据行数(包含列名那一行)</returns>
/// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓多文件导出时,需借助↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/// FolderBrowserDialog dilog = new FolderBrowserDialog();
/// dilog.Description = "请选择文件夹";
/// if (dilog.ShowDialog() == DialogResult.OK || dilog.ShowDialog() == DialogResult.Yes)//当选中文件并点击确定时运行
/// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓多文件导出时,需借助↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
public int DataTableToExcel1(DataTable data, string sheetName, string filePath)
{
    int count = 0;//控制返回状态,以及标记导出数据行
    IWorkbook workbook = null;
    FileStream fs = null;//创建文件流对象
    ISheet sheet = null;//工作表对象
    bool isColumnWritten = true;//设置列名是否导入

    #region DataTable→Excel
    try
    {
        fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);//文件流对象实例化,传入文件保存全路径,文件打开权限,文件读写权限

        #region 1.建立空的工作薄
        if (filePath.IndexOf(".xlsx") > 0) // 2007版本(判断文件路径中是否包含".xlsx",确定为Excel那个版本)
            workbook = new XSSFWorkbook();
        else if (filePath.IndexOf(".xls") > 0) // 2003版本(判断文件路径中是否包含".xlsx",确定为Excel那个版本)
            workbook = new HSSFWorkbook();
        #endregion

        #region 2.创建工作表
        if (workbook != null)//工作簿是否创建成功?创建工作表:返回(三目运算表达)
        {
            sheet = workbook.CreateSheet(sheetName);//传入工作表名称,并创建工作表
        }
        else
        {
            return -1;//返回值为-1时,则表示导出失败
        }
        #endregion

        #region 3.导出列名
        if (isColumnWritten) //控制列名是否导出bool对象:isColumnWritten
        {
            IRow row = sheet.CreateRow(0);//创建一行数据
            for (int j = 0; j < data.Columns.Count; j++)//
            {
                row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
            }
            count = 1;
        }
        else
        {
            count = 0;
        }
        #endregion

        #region 4.设置导出文件的列宽
        for (int columnWidth = 0; columnWidth < 10; columnWidth++)
        {
            sheet.SetColumnWidth(columnWidth, 15 * 256);
        }
        #endregion

        #region 5.导出数据
        Type type;//创建保存数据类型对象

        //创建CellStyle与DataFormat并加载格式样式
        IDataFormat dataformat = workbook.CreateDataFormat();
        ICellStyle style = workbook.CreateCellStyle();
        //style.DataFormat = dataformat.GetFormat("0.00"); //改变小数精度【小数点后有几个0表示精确到小数点后几位】  

        // 循环数据表行
        for (int i = 0; i < data.Rows.Count; i++)
        {

            IRow row = sheet.CreateRow(count);
            row.Height = 20 * 20;//设置行高

            #region 循环导出数据列
            for (int j = 0; j < data.Columns.Count; j++)//
            {
                try
                {
                    type = data.Rows[i][j].GetType();//获取数据类型
                    Debug.WriteLine(type);

                    #region 根据当前单元格数据类型写入数据
                    if (type == typeof(string))
                    {
                        row.CreateCell(j).SetCellValue(Convert.ToDouble(data.Rows[i][j]));
                    }
                    else if (type == typeof(int))
                    {
                        row.CreateCell(j).SetCellValue(Convert.ToInt32(data.Rows[i][j]));
                    }
                    else if (type == typeof(double))
                    {
                        row.CreateCell(j).SetCellValue(Math.Round(Convert.ToDouble(data.Rows[i][j]), 4));
                    }
                    else if (type == typeof(Single))
                    {
                        row.CreateCell(j).SetCellValue(Math.Round(Convert.ToSingle(data.Rows[i][j]), 4));
                    }
                    else
                    {
                        row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                    }
                    #endregion

                }
                catch (Exception)
                {
                    //如果获取的数据类型出错则将数据对象转换为string类型导出
                    row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                }
            }
            #endregion

            ++count;
        }
        #endregion

        #region 6.将文件流对象写入Excel,释放文件权限资源,并返回
        workbook.Write(fs); //写入到excel
        fs.Dispose();//释放资源
        return count;
        #endregion
    }
    catch (Exception ex)
    {
        MessageBox.Show("导出文件时出错!\n" + ex.Message, "提示");
        //Console.WriteLine("导出文件时出错,文件可能正被打开!\n" + ex.Message);
        return -1;
    }
    #endregion

}

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C# DataTable 操作上移和下移可以通过以下步骤实现: 1. 获取当前选中行的索引值。 2. 判断是上移还是下移操作。 3. 如果是上移操作,将当前行和上一行的数据交换。 4. 如果是下移操作,将当前行和下一行的数据交换。 5. 更新 DataTable 的数据源。 以下是示例代码: ``` // 获取当前选中行的索引值 int rowIndex = dataGridView1.CurrentCell.RowIndex; // 判断是上移还是下移操作 if (e.KeyCode == Keys.Up) { // 上移操作 if (rowIndex > ) { // 获取当前行和上一行的数据 DataRow currentRow = ((DataRowView)dataGridView1.Rows[rowIndex].DataBoundItem).Row; DataRow prevRow = ((DataRowView)dataGridView1.Rows[rowIndex - 1].DataBoundItem).Row; // 交换数据 object[] temp = currentRow.ItemArray; currentRow.ItemArray = prevRow.ItemArray; prevRow.ItemArray = temp; // 更新 DataTable 的数据源 DataTable dt = (DataTable)dataGridView1.DataSource; dt.AcceptChanges(); } } else if (e.KeyCode == Keys.Down) { // 下移操作 if (rowIndex < dataGridView1.Rows.Count - 1) { // 获取当前行和下一行的数据 DataRow currentRow = ((DataRowView)dataGridView1.Rows[rowIndex].DataBoundItem).Row; DataRow nextRow = ((DataRowView)dataGridView1.Rows[rowIndex + 1].DataBoundItem).Row; // 交换数据 object[] temp = currentRow.ItemArray; currentRow.ItemArray = nextRow.ItemArray; nextRow.ItemArray = temp; // 更新 DataTable 的数据源 DataTable dt = (DataTable)dataGridView1.DataSource; dt.AcceptChanges(); } } ``` ### 回答2: 抱歉,您没有明确提供问题或话题,无法为您提供准确详细的回答。请您再次提供具体的问题或话题,我会尽力帮助您! ### 回答3: 在计算机科学中,C语言是一种高级编程语言,它由贝尔实验室的Dennis Ritchie在20世纪70年代末发明。C语言的目标是为开发操作系统和编写和许多其他应用程序提供一个可移植、高效的工具。C语言具有许多使用和优点,其中一些包括: 1. 简单明了:C语言的语法和语义是简单的,容易理解和学习。此外,C语言没有太多的约束性,程序员可以自由地编写代码。 2. 低级别:C语言的低级别语法让程序员可以操纵内存,从而在效率上得到优化。C语言适合于编写一些对效率要求高的代码,例如操作系统和驱动程序。 3. 高度可移植性:C语言的编译器已经被移植到许多不同的计算机体系结构上。这意味着程序可以编写一次,在不同的计算机上运行。 4. 开放源代码:许多C语言编译器、库和工具是免费的,可以在不付出任何成本的情况下使用并改进。这使程序员可以在不牺牲质量的情况下提高效率。 C语言的应用非常广泛。它可以用于编写操作系统、设备驱动程序、游戏引擎、桌面应用程序、嵌入式系统等等。许多编程语言都借鉴了C语言的语法和结构,例如Java和C++。因此,C语言被认为是计算机科学的重要里程碑,对现代IT行业的发展有重要贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值