请选择 进入手机版 | 继续访问电脑版

无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 508|回复: 0

C# DataGridView导出Excel,设置单元格合并,隐藏行

[复制链接]

362

主题

392

帖子

1620

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1620
发表于 2018-5-10 09:53:54 | 显示全部楼层 |阅读模式
C# DataGridView导出Excel,设置单元格合并,隐藏行

不得不承认,做程序需要研究。

DataGridView导出Excel的源码

[C#] 纯文本查看 复制代码
using System.Windows.Forms;
using System.Collections.Generic;
using System;
using Microsoft.Office.Interop.Excel;
public class CommanPrint
{
    /// <summary> 
    /// 导出Excel

    /// 版权所有 : 天山寒雪 QQ:757015000 MSN: [email]haijun.qin@hotmail.com[/email]

    /// </summary> 
    /// <param name="mydgv">控件 DataGridView </param> 
    /// <param name="dic">中英文对照的标题 </param> 
    public static void ExportTasks(DataGridView mydgv, Dictionary<string, string> dic)
    {
        // 定义要使用的Excel 组件接口 
        // 定义Application 对象,此对象表示整个Excel 程序 
        Microsoft.Office.Interop.Excel.Application excelApp = null;
        // 定义Workbook对象,此对象代表工作薄 
        Microsoft.Office.Interop.Excel.Workbook workBook;
        // 定义Worksheet 对象,此对象表示Execel 中的一张工作表 
        Microsoft.Office.Interop.Excel.Worksheet ws = null;
        //定义Range对象,此对象代表单元格区域 
        Microsoft.Office.Interop.Excel.Range range;

       // Microsoft.Office.Interop.Excel.c

        int dcell = 1;
        int rowindex = 0; int colindex = 0;

        int rowcount = mydgv.Rows.Count;
        int colcount = mydgv.Columns.Count;
        int dispcolcount = dic.Count;
        try
        {
            //初始化 Application 对象 excelApp 
            excelApp = new Microsoft.Office.Interop.Excel.Application();
            //在工作薄的第一个工作表上创建任务列表 
            workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            ws = (Worksheet)workBook.Worksheets[1];

            // 命名工作表的名称为 
            ws.Name = "Sheet1";
            //创建缓存 
            Object[,] objdata = new object[rowcount + 2, colcount];
            //创建标题 
            foreach (string s in dic.Keys)
            {
                objdata[rowindex, colindex++] = dic[s].ToString();
            }
                //创建缓存 
            //Object[,] objdata1 = new object[rowcount + 1, colcount];
            //创建标题 
            colindex = 0;
            foreach (string s in dic.Keys)
            {
                objdata[1, colindex++] = s;
            }
            //获取数据 
            for (int i = 0; i < rowcount; i++)
            {
                dcell = 0;
                foreach (string ss in dic.Keys)
                {
                    for (int j = 0; j < colcount; j++)
                    {
                        if (mydgv.Columns[j].Name == ss)
                        {
                            objdata[i + 2, dcell++] = mydgv.Rows[i].Cells[j].FormattedValue.ToString(); //得到样式之后的值 
                        }
                    }
                }
            }
            //设置表头
            
            range = ws.get_Range("A1", "A2");            
            range.Merge(false);
            range.Value2 = "客户名称";
            range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.Merge(true);
            range.Value2 = "合计";
            range.HorizontalAlignment = Constants.xlCenter;
            range = ws.get_Range("D1","D2");
            range.Merge(false);
            range.Value2 = "单位";
            //写入Excel        
            range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[rowcount+1, dispcolcount]);
            range.Value2 = objdata;         
            System.Windows.Forms.Application.DoEvents();
            //设置格式 
            excelApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlLeft; //全局左对齐 
            excelApp.Cells.EntireColumn.AutoFit();
            range = ws.get_Range(excelApp.Cells[1, 1], excelApp.Cells[2, colcount]);            
            range.Font.Bold = true; //标题粗体 
            //excelApp.Rows[2].Hidden = true;
            range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[3, colcount]);
            range.EntireRow.Hidden = true;
            //range.Merge(true);
            //range.Value2 = "wwww";
            range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.HorizontalAlignment = Constants.xlCenter;
            //显示 Excel 
            excelApp.Visible = true;
            //range.Hidden = true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

这里使用的是天山寒雪的源码,保留原信息,并致以感谢。

我从他的源码的基础上加上了关于多表头的设置和行的隐藏,在多表的设置中需要用到单元格合并。

[C#] 纯文本查看 复制代码
 range = ws.get_Range("A1", "A2");            
            range.Merge(false);
            range.Value2 = "客户名称";

选择A1和A2两个单位格,合并,设值。属于上下合并

[C#] 纯文本查看 复制代码
 range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.Merge(true);
            range.Value2 = "合计";

选择第一行第二个和第一行第三个单元格,合并,赋值,左右合并。

隐藏row

[C#] 纯文本查看 复制代码
 range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[3, colcount]);
            range.EntireRow.Hidden = true;

选中部分单元格,把选中的单元格所在的行的Hidden属性设为true。

完成。

文章来自:https://blog.csdn.net/fqlove/article/details/4375243


windows .net(C#+MSSQL) linux(php+mysql)  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软件编程 ( 鄂ICP备11006601号鄂公网安备 42011102001337号 |

GMT+8, 2018-9-21 03:16 , Processed in 0.206814 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表