用C#操作Excel以及产生Chart

C# Excel处理四大方案全解析:OpenXml、NPOI、EPPlus与Spire.Office选型指南 在.NET企业级应用开发中,数据处理与报表生成是核心需求,而Excel文件作为广泛使用的数据交换格式,其高效读写成为关键技术挑战。其原理在于通过解析或生成Office Open XML(OOXML)等文件结构,实现对单元格数据、样式、公式及图表的编程控制。这项技术的价值在于能够自动化业务流程,提升数据处理效率,并确保数据在不同系统间的准确流转。应用场景涵盖从简单的数据导出导入,到复杂的动态报表生成、财务数据分析以及批量文档处理。本文聚焦于C#生态中处理Excel的四大主流方案:微软官方的底层OpenXml 阅读详情

简介

用一个小范例示范如何在C#中操作Excel

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;

namespace TestExcel
{
    public class CBExcel
    {
        Excel.Application xlApp;    // 声明需要的 Exccel Application 变量
        Excel.Workbook xlWorkBook;  // 声明 work book
        Excel.Worksheet xlWorkSheet;// 声明 excel 的sheet
        object misValue = System.Reflection.Missing.Value;

        public CBExcel()
        {
        }

        // 设定数据
        public void SetData(int i, int j, string data)
        {
            xlWorkSheet.Cells[i, j] = data;
        }

        // 插入一个图表到excel分页中
        public void SetChart(string start, string end, Excel.XlChartType type)
        {
            Excel.Range chartRange;

            Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing); // 建立图表
            Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250); //加入图表及设定大小
            Excel.Chart chartPage = myChart.Chart;

            chartRange = xlWorkSheet.get_Range(start, end); // 设定图表数据的开始与结尾
            chartPage.SetSourceData(chartRange, misValue);
            chartPage.ChartType = type; // 设定图表的样式
        }

        // 释放用的函数
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch
            {
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }

        // 创建一个excel
        public void Create()
        {
            xlApp = new Excel.ApplicationClass(); // 创建一个excel
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); // 取得第一页的分页
        }

        // 储存excel
        public void SaveAs()
        {
            // 这样储存会跳出一个另存文件视窗
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
        }

        public void Release()
        {
            // 释放用到的excel实例
            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
        }
    }
}
这是一个经过简单封装过的类,将一些操作的部份封装在一个类中,好方便使用。

使用的代码

private void button1_Click(object sender, EventArgs e)
{
    CBExcel excel = new CBExcel(); // 创建CBExcel类
    excel.Create(); // 建立Excel
    excel.SetData(1, 1, ""); // 设定数据
    excel.SetData(1, 2, "Student1");
    excel.SetData(1, 3, "Student2");
    excel.SetData(1, 4, "Student3");

    excel.SetData(2, 1, "Term1");
    excel.SetData(2, 2, "80");
    excel.SetData(2, 3, "65");
    excel.SetData(2, 4, "45");

    excel.SetData(3, 1, "Term2");
    excel.SetData(3, 2, "81");
    excel.SetData(3, 3, "61");
    excel.SetData(3, 4, "41");

    excel.SetData(4, 1, "Term3");
    excel.SetData(4, 2, "82");
    excel.SetData(4, 3, "62");
    excel.SetData(4, 4, "42");

    excel.SetChart("A1", "D4", Excel.XlChartType.xlLine); // 设定图表样式与开始结束位置
    excel.SaveAs(); // 储存Excel
    excel.Release();// 释放内存
}


excel输出结果

范例下载

http://download.youkuaiyun.com/detail/cloudhsu/5072683

2013/02/20新增

支持Excel与CSV数据汇出的代码

因为在实际的需求中,公司中的一些计算机可能不会安装Excel,为了让汇出的工作能正常运作,因此我做了下列的修正

接口:IExcel用来作抽象

interface IExcel
{
    void Create();
    void SetData(int i, int j, string data);
    void SaveAs();
    void Release();
}

CBExcel的部份则实践IExcel接口

public class CBExcel : IExcel
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;
    const string ChartStart = "A1";
    string m_ChartEnd;
    int m_MaxI;
    int m_MaxJ;
    public CBExcel()
    {
        m_ChartEnd = "A1";
        m_MaxI = -1;
        m_MaxJ = -1;
    }

    public void SetData(int i, int j, string data)
    {
        xlWorkSheet.Cells[i, j] = data;
        CheckChartEnd(i, j);
    }

    private void CheckChartEnd(int i, int j)
    {
        if (m_MaxI <= i)
            m_MaxI = i;
        if (m_MaxJ <= j)
            m_MaxJ = j;
        const int a = 0x41;
        int word = a + j - 1;
        m_ChartEnd = string.Format("{0}{1}", Convert.ToChar(word), m_MaxI);
    }

    public void SetChart(Excel.XlChartType type)
    {
        Excel.Range chartRange;

        Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(500, 80, 350, 350);
        Excel.Chart chartPage = myChart.Chart;

        chartRange = xlWorkSheet.get_Range(ChartStart, m_ChartEnd);
        chartPage.SetSourceData(chartRange, misValue);
        chartPage.ChartType = type;
    }

    public void SetChart(string start, string end, Excel.XlChartType type)
    {
        Excel.Range chartRange;

        Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(500, 80, 350, 350);
        Excel.Chart chartPage = myChart.Chart;

        chartRange = xlWorkSheet.get_Range(start, end);
        chartPage.SetSourceData(chartRange, misValue);
        chartPage.ChartType = type;
    }

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch
        {
            obj = null;
        }
        finally
        {
            GC.Collect();
        }
    }

    public void Create()
    {
        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    }

    public void SaveAs()
    {
        SetChart(Excel.XlChartType.xlLine);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
    }

    public void Release()
    {
        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
    }
}

额外在实践一个CBExcelCSV

我用最偷懒的实践手法,直接开个够大的内存来存数据

public class CBExcelCSV : IExcel
{
    List<string[]> m_data = new List<string[]>();

    const int MAX_COLUMN = 150;
    const int MAX_LINE = 2000;
    int m_MaxLine;
    int m_MaxColumn;

    #region IExcel Members

    public void Create()
    {
        m_MaxColumn = -1;
        m_MaxLine = MAX_LINE;
        for (int i = 0; i < MAX_LINE; i++)
        {
            m_data.Add(new string[MAX_COLUMN]);
        }
    }

    public void SetData(int i, int j, string data)
    {
        if (i-1 >= m_MaxLine)
        {
            m_data.Add(new string[MAX_COLUMN]);
            m_MaxLine++;
        }
        if (m_MaxColumn < j)
        {
            m_MaxColumn = j;
        }
        m_data[i-1][j-1] = data;
    }

    public void SaveAs()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < m_data.Count; i++ )
        {
            sb.Append(m_data[i][0]);
            for (int j = 1; j < m_MaxColumn; j++)
            {
                sb.Append(",");
                sb.Append(m_data[i][j]);
            }
            sb.Append("\r\n");
        }
        save(sb.ToString());
    }

    void save(string data)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 1;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fileName = saveFileDialog1.FileName;
            File.WriteAllText(fileName, data);
        }
    }

    public void Release()
    {
    }

    #endregion
}

再实践一个CBExcelWrapper来封装,里面有一个IExcel成员,并将所有的执行交给IExcel的实例执行。

public class CBExcelWrapper : IExcel
{
    IExcel excel;
    bool m_IsExcelInstalled;
    public CBExcelWrapper()
    {
        m_IsExcelInstalled = CheckExcelInstalled();
        // 有安装Excel就使用CBExcel类,没有则使用CBExcelCSV类
        if(m_IsExcelInstalled)
        {
            excel = new CBExcel();
        }
        else
        {
            excel = new CBExcelCSV();
        }
    }

    bool CheckExcelInstalled()
    {
        // 这一段代码的重点就是判断到底有没有装Excel
        bool installed = false;
        Type officeType = Type.GetTypeFromProgID("Excel.Application");
        if (officeType != null)
        {
            installed = true;
        }
        return installed;
    }

    #region IExcel Members

    public void Create()
    {
        excel.Create();
    }

    public void SaveAs()
    {
        excel.SaveAs();
    }

    public void Release()
    {
        excel.Release();
    }

    public void SetData(int i, int j, string data)
    {
        excel.SetData(i, j, data);
    }

    #endregion
}


Excel自动化实战:ActiveX/COM原理、多语言实现与避坑指南 在数据处理与报表生成领域,自动化操作Excel是提升效率的核心需求。其底层原理基于微软的COM(组件对象模型)技术,该技术定义了二进制级别的标准,允许不同编程语言通过接口调用Excel丰富的功能。ActiveX作为COM的一种具体实现,为外部程序提供了对Excel应用程序实例的完全控制权,从而实现从读写单元格、应用公式到生成图表等精细操作。这项技术的核心价值在于能够无缝衔接现有工作流,实现高度定制化的报表生成和数据处理自动化。在工程实践中,开发者常使用Python的pywin32、C#的COM Intero 阅读详情

相关推荐

C++Builder OLE自动化Excel:从基础封装到大数据报表实战

OLE(对象链接与嵌入)是Windows平台上实现应用程序间自动化交互的核心COM技术,其原理是通过标准的接口协议,允许一个程序(如C++Builder应用)创建并控制另一个程序(如Excel)的对象模型,实现无缝操作。这项技术的工程价值在于,它能让原生C++应用在不依赖外部脚本或中间件的情况下,深度集成并自动化Office套件的复杂功能,从而在工业控制、数据采集和企业级系统中,高效完成报表生成、数据分析与可视化等任务。针对C++Builder开发环境,通过导入Excel类型库并封装可复用的OLE辅助类,开

weixin_33725270的博客 548

C# chart实时数据显示简单示例工程文件

C# chart实时数据显示简单示例工程文件, 详细说明可以参看相关博文

C++集成Spire.XLS实战:高效处理Excel报表与数据填充

在C++开发中,处理Excel文件是常见的需求,尤其是在桌面应用、后台服务和工业控制软件领域。传统方法如COM接口依赖重、跨平台差,而CSV格式则无法保留公式和样式。因此,集成专业的Excel处理库成为提升开发效率的关键。Spire.XLS for C++作为一个商业组件,提供了不依赖微软Office的解决方案,支持创建、读取、编辑和转换Excel文档,其核心价值在于高效的数据处理和报表生成能力。通过环境配置、核心功能实战(如样式设置、公式计算)以及性能优化技巧,开发者可以在纯C++环境中实现复杂Excel

weixin_30235225的博客 337

C#操作excel(NPOI篇)

前一篇介绍了怎么用com操作excel,后来有朋友说用NPOI好,下面我也来介绍一些,下面是我收集的一些资料。 1.在 Server 端存取 Excel 檔案的利器:NPOI Library Codeplex 軟體套件(Package)資訊 套件名稱 NPOI 作者 tonyqus, huseyin, atao 目前版本 1...

weixin_30701521的博客 382

C#实现读取Excel表格中的数据并显示

可以通过NuGet包管理器来安装,或者在Visual Studio的解决方案资源管理器中右键点击项目,选择“管理NuGet程序包”,然后搜索。接下来,我们选择了第一个工作表,并获取了行数和列数。替换为实际的Excel文件路径。另外,还需要根据实际情况调整代码以适应不同的需求,比如选择特定的工作表或处理特定的数据类型等。在C#中,我们可以使用一些库来实现读取Excel表格中的数据并显示。在上述代码中,我们首先指定了Excel文件的路径,并创建了一个。,它提供了许多功能强大的API来处理Excel文件。

qq_37934722的博客 775

C# Winform上位机实现Modbus温湿度采集系统实战

工业自动化领域,上位机软件作为设备与数据管理的核心,常需实现稳定高效的采集与监控。C# Winform凭借其部署简单、开发效率高,成为中小型工控项目的常用选择。Modbus协议作为工业通信标准,支持RTU与TCP两种模式,广泛应用于传感器数据读取。通过串口或以太网,上位机可轮询温湿度传感器,解析寄存器数据,并利用SQLite数据库完成历史存储与查询。合理设计通信层与数据层,配合后台线程与批量写入策略,能有效避免界面卡顿与数据丢失,保障7x24小时稳定运行。本文围绕温湿度采集系统,分享C# Winform上位

weixin_33826609的博客 370

C#实现数据导出任一Word图表的通用呈现方法及一些体会

使用该控件首先要引入 System.Web.DataVisualization.dll 程序集,通过定义 System.Web.UI.DataVisualization.Charting.Chart 类来实现,本来采用该开发方案的初衷是觉得都是微软的技术,图表的呈现类型也比较丰富,可在实际的开发中,情况没有想像的那么顺利,提供的技术文档非常有限,各种百度也是凤毛麟角,经过努力与探索,最终还是实现了需求。(1)负责具体业务的应用程序,输出后的数据,存入一个二维字符串数组里,模拟 Excel 数据存储模式。

初九之潜龙勿用 2616

C# Winform温湿度上位机实战:Modbus轮询、曲线绘制与SQLite存储

在工业现场,温湿度采集是典型的物联网数据链路应用,传感器通过 Modbus RTU/TCP 总线与上位机交互。理解寄存器、功能码与轮询机制是通信基础;C# Winform 提供了实时显示与曲线绘制的成熟载体,配合跨线程刷新与增量绘图可保证界面稳定。数据层采用 SQLite 存储历史记录,结合 Dapper 批量事务写入解决高频采集与查询压力。从药房、车间到档案库,这类系统需要兼顾通信稳定性、界面流畅性和数据可回溯性。围绕通信层、界面层与存储层展开的架构设计,正是C#温湿度上位机落地到工程现场的关键。

weixin_34194359的博客 472

Unity集成EPPlus:跨平台Excel数据处理与IL2CPP兼容实战

在游戏开发和数据驱动的应用开发中,Excel表格是常见的数据配置和管理工具。其原理是通过操作Office Open XML格式文件,实现对结构化数据的读写和编辑。这项技术的核心价值在于打通了策划、美术与开发之间的工作流,将非技术友好的表格数据无缝转化为程序可用的数据结构。在Unity开发环境下,这尤其体现在游戏配置数据的热更新、运行时报表导出以及本地化资源管理等多个应用场景。然而,Unity独特的IL2CPP编译环境对传统的.NET库提出了兼容性挑战。本文聚焦于如何将成熟的EPPlus库稳定集成到Unity

wangqiaowqo的专栏 375

恒温测控上位机开发实战:C# Winform串口通信与PID控制完整方案

在工业测控与实验室仪器领域,上位机与下位机之间的稳定通信是系统可靠运行的基础。串口通信作为最经典的物理层连接方式,依靠简洁的帧协议设计,可实现温度、压力等数据的实时采集与控制指令下发。结合C# Winform这一成熟桌面开发框架,开发者能够快速构建兼具交互性与工程实用性的监控界面。而PID控制算法作为恒温系统的核心调节策略,通过合理的参数整定与抗积分饱和处理,能有效抑制温度超调,提升控温精度。该技术组合广泛应用于恒温槽、老化测试箱、PCR仪及电池温控平台等场景。本文围绕一套完整的恒温测控上位机源码,从通信协

anjichan4261的博客 471

基于C# WinForms与Modbus RTU的温湿度监控上位机开发实战

在工业物联网与现场设备数据采集场景中,串口通信与上位机软件是连接底层传感器与管理系统的关键。Modbus RTU作为工业现场应用最广泛的协议之一,搭配RS485总线可实现多设备稳定轮询。本文以冷库温湿度监控为例,介绍使用C# WinForms构建上位机软件的全过程:从Modbus通信、寄存器解析到SQLite数据库设计、UI实时刷新,再到现场部署的常见故障排查。通过分层架构、线程模型与批量入库等工程实践,解决工业环境下的数据实时性与系统稳定性问题,为开发类似数据采集与监控系统提供可复用的参考。文章兼顾基础原

weixin_33851429的博客 426

C# ModbusRtu或TCP协议上位机源码:存储、数据传输至SQL SERVER数据库,趋...

该框架以“高内聚、低耦合、可配置、易扩展”为设计宗旨,将 Modbus-RTU 通讯、工业报警、实时趋势、数据报表、反向控制等 SCADA 核心功能全部模板化。C# ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,有详细注释,需要哪个协议版本。C# ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,有详细注释,需要哪个协议版本。

QQ68823886的博客 30

C# WinForms结合Modbus实现工业上位机温湿度采集与监控系统实战

在工业物联网与智能制造场景中,如何将现场温湿度传感器数据稳定、实时地采集并展示,是设备配套软件的核心挑战。上位机作为连接硬件与操作员的桥梁,负责数据的采集、显示、存储与管理。Modbus协议作为工业现场最通用的通信标准,通过寄存器映射与RTU/TCP报文实现设备交互。C# WinForms技术栈凭借其部署简单、学习成本低、串口与数据库支持完善等优势,在单机局域网型数据采集系统中依然占据重要位置。本文围绕温湿度监控上位机开发,讲解了从需求拆解、分层架构、Modbus通信实现、SQLite数据存储到界面实时刷新

weixin_34377919的博客 450

从零到自动化:我用VBScript给CST Studio Suite写了个‘数据搬运工’

本文分享了一位射频工程师如何利用VBScript为CST Studio Suite开发自动化工具,实现S参数批量导出的实战经验。通过详细讲解VBScript在CST中的应用、数据结构理解及效率优化技巧,帮助工程师提升工作效率,减少重复劳动。特别适合需要处理大量S参数数据的射频工程师参考。

aijiagui7454的博客 428

C#实现SPC在线质量监控:控制图、判异规则与Cpk分析

统计过程控制(SPC)是制造业保障质量稳定性的核心方法,其本质是通过分析生产过程数据中的随机波动与异常波动,判断工序是否处于受控状态。控制图作为SPC的主要工具,能够直观展示数据的均值与离散趋势,结合判异规则可及时识别趋势性偏移、周期性波动等异常模式,而过程能力指数Cpk/Ppk则进一步量化了工序满足规格要求的能力。在工程实现中,C#凭借其成熟的桌面开发生态、高效的多线程处理能力以及与工业设备通信的便捷性,成为构建实时SPC监控系统的理想选择。通过串口采集、数据分组、控制限计算和Web实时推送,可打造覆盖采

weixin_30561177的博客 367

echarts图表导出到excel

echarts图表导出到excel中的解决方法,做个备忘录,以防忘记

上一篇: App同心圆
下一篇: 程序员的一天:台湾个人移动游戏开发者
云瑀
博客等级 码龄17年 502粉丝 150原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值