【机房收费系统C#版】——导出Excel

前言

机房合作開始好长了一段时间。反重复复开了几次会,项目也是一拖再拖,作为组长。有80%的责任都在于我。为了不让这个项目陪着我过春节。要求自己一定要在这几天敲完。

还是一样的问题,用C#敲,从一開始到如今,不论什么一个功能的实现都是现学现查。对于导出Excel表格这个功能来说更不是意外。在网上找了非常多资料,反重复复地做小demo,最终有了我想要的效果。

实现

首先是加入引用

然后在程序代码上加入using

<span style="font-size:18px;">using System;
using System.Data;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;</span>

在窗口上加入datagriview控件,加入列

然后能够依据自己的须要加入列数,也能够编辑列标题。

效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

代码实现

<span style="font-size:18px;"> private void Form2_Load(object sender, EventArgs e)
        {

            dgvAccectCash.AutoGenerateColumns = true;
            dgvAccectCash.Columns[0].HeaderText = "学号";
            dgvAccectCash.Columns[1].HeaderText = "充值金额";
            dgvAccectCash.Columns[2].HeaderText = "充值时间";
            dgvAccectCash.Columns[3].HeaderText = "充值日期";
            dgvAccectCash.Columns[4].HeaderText = "操作用户";
            dgvAccectCash.Columns[5].HeaderText = "是否结账";

        }</span>

定义两个函数,一个是将datagridview中的数据导入表中。一个是将datagridview中的数据导出到一张表中。

1、一个是将datagridview中的数据导入表中

<span style="font-size:18px;">  private DataTable exporeDataToTable(DataGridView dataGridView)
        {
            //将datagridview中的数据导入到表中
            DataTable tempTable = new DataTable("tempTable");
            //定义一个模板表,专门用来获取列名
            DataTable modelTable = new DataTable("ModelTable");
            //创建列
            for (int column = 0; column < dgvAccectCash.Columns.Count; column++)
            {
                //可见的列才显示出来
                if (dgvAccectCash.Columns[column].Visible == true)
                {
                    DataColumn tempColumn = new DataColumn(dgvAccectCash.Columns[column].HeaderText, typeof(string));
                    tempTable.Columns.Add(tempColumn);
                    DataColumn modelColumn = new DataColumn(dgvAccectCash.Columns[column].Name, typeof(string));
                    modelTable.Columns.Add(modelColumn);
                }
            }
            //加入datagridview中行的数据到表
            for (int row = 0; row < dgvAccectCash.Rows.Count; row++)
            {
                if (dgvAccectCash.Rows[row].Visible == false)
                {
                    continue;
                }
                DataRow tempRow = tempTable.NewRow();
                for (int i = 0; i < tempTable.Columns.Count; i++)
                {
                    tempRow[i] = dgvAccectCash.Rows[row].Cells[modelTable.Columns[i].ColumnName].Value;
                }
                tempTable.Rows.Add(tempRow);
            }
            return tempTable;
        }</span>

2、将datagridView中的数据导出到一张表中

<span style="font-size:18px;"> private void OutputAsExcelFile(DataGridView dataGridView)
        {
            //将datagridView中的数据导出到一张表中
            DataTable tempTable = this.exporeDataToTable(dataGridView);
            //导出信息到Excel表
           // Microsoft.Office.Interop.Excel.ApplicationClass myExcel;
            Microsoft.Office.Interop.Excel.ApplicationClass myExcel;
            Microsoft.Office.Interop.Excel.Workbooks myWorkBooks;
            Microsoft.Office.Interop.Excel.Workbook myWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet myWorkSheet;
            char myColumns;
            Microsoft.Office.Interop.Excel.Range myRange;
            object[,] myData = new object[500, 35];
            int i, j;//j代表行,i代表列
            myExcel = new Microsoft.Office.Interop.Excel.ApplicationClass();
            //显示EXCEL
            myExcel.Visible = true;
            if (myExcel == null)
            {
                MessageBox.Show("本地Excel程序无法启动!请检查您的Microsoft Office正确安装并能正常使用", "提示");
                return;
            }
            myWorkBooks = myExcel.Workbooks;
            myWorkBook = myWorkBooks.Add(System.Reflection.Missing.Value);
            myWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Worksheets[1];
            myColumns = (char)(tempTable.Columns.Count + 64);//设置列
            myRange = myWorkSheet.get_Range("A1", myColumns.ToString() + "5");//设置列宽
            int count = 0;
            //设置列名
            foreach (DataColumn myNewColumn in tempTable.Columns)
            {
                myData[0, count] = myNewColumn.ColumnName;
                count = count + 1;
            }
            //输出datagridview中的数据记录并放在一个二维数组中
            j = 1;
            foreach (DataRow myRow in tempTable.Rows)//循环行
            {
                for (i = 0; i < tempTable.Columns.Count; i++)//循环列
                {
                    myData[j, i] = myRow[i].ToString();
                }
                j++;
            }
            //将二维数组中的数据写到Excel中
            myRange = myRange.get_Resize(tempTable.Rows.Count + 1, tempTable.Columns.Count);//创建列和行
            myRange.Value2 = myData;
            myRange.EntireColumn.AutoFit();
        }</span>

调用这两个函数实现导出Excel表格。

<span style="font-size:18px;"> private void button1_Click(object sender, EventArgs e)
        {
            exporeDataToTable(dgvAccectCash);//将datagridview中的数据导入到表中
            OutputAsExcelFile(dgvAccectCash);//将datagridView中的数据导出到一张表中
        }</span>

效果

问题

这里面还是有一些问题:"无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。

请改用适用的接口".百度了一下是由于引用里“Microsoft.Office.Interop.Excel”这个属性的问题,改动“嵌入互操作类型”true或false属性就好了。

总结

通过这个一小样例,感觉自己成长了不少,尽管在学习的过程中我们会遇到非常多问题。这些问题看起来非常困难。可是仅仅要我们学会站在巨人的肩膀上学习,给自己多一点耐心和信心,相信这些困难一定会成为我们成长路上的基石。

时间: 2024-08-17 14:50:19

【机房收费系统C#版】——导出Excel的相关文章

机房收费系统合作版(七)——总结

历经许许多多的磨难机房收费系统合作版终于告一段落了.在机房收费系统中的收获我不能说自己收获的太少了.因为相比之前任何一个阶段的学习,这个阶段是我收获的最多,感悟最多的一个阶段. 技术: 初识框架,对它有一种莫名的好感,很是喜欢.也从这个好框架中感受到了自己的与XS,LSH他们的差距.他们是搭这个架构的人,而自己光是对这个架构的学习就整整花了一周.这就是显而易见的差距. 带着莫大的好奇心,和连海苦战两天,照猫画虎,也搭建了属于这个系统的"框架".为了练手,我俩还搭建了Jenkins.由于

机房收费系统合作版(四)——泛型之解

************前言: 开篇起笔先问:"泛型是什么"?解:泛型是类型抽象类.作用是什么:"通过对类型的抽象,封装,大量减少我们的代码量". 从开始学习面向对象,"抽象"一词就不断的在耳边重复.但是在没有做过项目之前,尤其是在没有尝试着用面向对象的思维去做项目之前,"抽象"在脑子里永远都是一个虚无缥缈的词儿.那么在具体的项目中,我们是如何一步一步地把"抽象"变得具体课件的呢?--继承,泛型-- ***

机房收费系统VB版(一)——系统分析

      首先,我们先回答两个个问题:         1.机房收费系统"是什么"?         2.机房收费系统应该"干什么"?        我的回答:         1.机房收费系统顾名思义就是一个收费系统.         2.机房收费系统主要任务流程是:注册--充值--上机--下机--退卡.而其他的功能都是各个部分人员主要负责的功能.       然后,我们进一步分析一下这个系统的功能. 我们可以把这个系统比作网吧的收费系统,而它的主要面对对象是学

机房收费系统合作版(一)——框架搭建

机房收费系统的合作版中首次尝试使用框架:三层 + Spring.NET +Nhibernet框架. 一.整体框架图如下: 二.三层架构图如下: DAL层: Adapter: 结构: 实现IRepositoryDAL接口:扩展 继承RepositoryBaseDAL父类:复用 功能: 操作类:封装基本的操作--增删改查 this.HibernateTemplate.Save(entity) this.HibernateTemplate.Delete(entity) this.HibernateTe

机房收费系统合作版——VS2013自带报表

机房收费系统已经敲过两次了,每次敲的感觉都不一样,收获也不一样. 第一次敲机房,主要是克服对代码的恐惧,只要将功能实现就行:而第二次,主要就是加入前期对整个系统的分析.设计,然后在实践中理解三层架构以及对设计模式的应用:现在是第三次敲,主要是锻炼我们团队合作的能力,大家的讨论研究,合作交流等.由此可见,我们走的每一步都很重要,都是必不可少的. 今天我们来说一说我们的vb.net中自带的报表. 一.报表的制作 1,我们右击U层所在文件夹添加"新建项". 2,在弹出的的添加新建项窗口中找到

机房收费系统VB版(四)——上下机

在敲系统的过程中,觉得有点困难的是上下机和结账.当理不清关系,没有头绪的时候,我们先画画图吧,把逻辑理清了,思路自然就有了,不会的再去查就可以了.今天我们就先来分析一下所谓的上下机. 一.上机     上机流程图:     解释说明:    (1)判断文本框的内容是否为空,是否为数字,"否"则弹出提示框: (2)若文本框为数字,判断卡号是否注册,"否"则弹出提示框: (3)若卡号已经注册, 判断卡号是否正在上机,"是"则弹出提示框: (4)若卡号

项目总结——机房收费系统合作版

机房合作就结束了,这次合作开发是第一次与别人一块儿开发一个系统,收获还是蛮大的.以下我总结几点算是经验吧,供以后參考: 管理上 1.计划 在准备合作开发之前我们三个去找米老师,老师给我们规定了时间.半个月.尽管计划是组长制定的,但假设没 有一个明白的计划规定什么时间段干什么.面对绘图,文档,代码实现,调试等等,项目就不可能有条不紊的进行. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmd6aWppZWppYXlvdQ==/font/5a6L

机房收费系统合作版(三)——UI思索

案件追踪系统1.0暂告一段落.验收过程中,MR MI针对UI界面提出了许多自己的想法.针对TGB项目的UI设计我也有我的感受: 1.不论大小项目,只要一看界面准有70%到80%熟悉度. 2.一看这些项目,大概能够猜测到是同一伙儿做出来的. 3.只有我们开发人员(熟悉业务逻辑的人)知道下一步该做什么. *****惨遭嫌弃的UI******: 举个例子.感受最深的是当时的基础系统采集数据.数据采集时,正直2014年最炎热时,顶着硕大的高温来往于至善楼与数理楼之间.数据采集之初,想象的很美好:我们只是

机房收费系统重构版:那个系统我们一起遇到的问题

前言:  总是说在问题中茁壮成长,俗话说光说不练假把式!回想之前确实停留在嘴上说说就完事了的假把式上,这次敲了第二次机房重构后根据自己的切身经历仔细回味了一番.相比于之前有了更深的理解吧,感觉还是有记录的必要性,于是乎整理了一下. 罗列: 以下是我当时记录的19个类型的问题的开始和结束的二张截图(篇幅原因不一一截图).这是学习的第一步将问题进行罗列,寻找问题的解决方案,找到最优解决方案,然后记录下来(好记性不如烂笔头)! 整理.总结: 记录好了,接下来就该整理这些问题,分析自己遇到这些问题的共性