WinForms C# 导入和导出 CSV 文件 Spread.NET

news2024/11/19 18:40:29

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件

2023 年 11 月 17 日
使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。

Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎,具有 450 多个函数以及导入和导出 Microsoft Excel 电子表格的能力。开发人员可以利用广泛的 .NET 电子表格 API 和强大的计算引擎来创建分析、预算、仪表板、数据收集和管理、科学和财务应用程序。

在此博客中,MESCIUS 产品经理 Kevin Ashley 将带您完成使用 Spread.NET 导入和导出 CSV 文件中的数据所需的所有步骤,包括:

  • 创建/配置项目
  • 创建文件菜单
  • 创建/配置SplitContainer
  • 添加事件处理程序代码
  • ...以及更多!

将在运行时使用 Spread Designer 工具,只需一行代码即可在运行的应用程序中编辑 Excel 电子表格实例。最后,我将展示如何创建一个简单的前端电子表格用户界面,将 FpSpread 电子表格控件与 NameBox和 FormulaTextBox 控件集成,使用分割窗格创建主用户界面,以及如何实现菜单项来处理 文件 - C# 和 VB中的“打开”、“文件 - 保存”和 “文件 - 设计” 命令 。

以下是在 C# 和 VB.net WinForms 中导入和导出 CSV 文件的步骤:

  • 创建项目
  • 配置项目
  • 创建文件菜单
  • 创建SplitContainer1
  • 配置SplitContainer1
  • 创建SplitContainer2
  • 创建 FpSpread
  • 创建名称框
  • 创建公式文本框
  • 创建 WinForms 电子表格设计器组件
  • 为文件菜单项创建事件处理程序
  • 添加事件处理程序代码

这些步骤需要:

  • Microsoft Visual Studio 2022(注意:虽然这些步骤适用于 VS2022 和 .NET 6,但 Spread.NET WinForms 也可以在面向 .NET 4.6.2+ 的早期版本的 Visual Studio 中工作,遵循这些相同的步骤)
  • Spread.NET for WinForms(试用版或许可版)- 在此处获取 Spread.NET WinForms 的 30 天免费试用版 
 

第 1 步:创建项目

创建一个新项目

我们可以首先在Visual Studio 2022中创建一个新项目  ,选择 C#、Windows和 Desktop来筛选项目,然后选择C# 或 VB  WinForms App

第 2 步:配置项目

配置项目

输入 SpreadWinformsCSVIO作为 项目名称

第 3 步:创建文件菜单

现在,让我们添加一个MenuStrip。在 “工具箱” 窗口 ( F4 ) 的“菜单和工具栏”类别下,双击 MenuStrip组件以 在窗体中创建一个新的 MenuStrip :

菜单条工具箱

 

 通过使用关联的快捷键单击,创建 “文件 – 打开”、  “文件 – 保存”、  “文件 – 另存为”、  “文件 – 设计”和 “文件 – 退出”菜单项:

文件菜单

 

请注意, 文件 - 保存 菜单项最初应被禁用。菜单分隔符(  对菜单项文本使用“-”来创建菜单分隔符)和快捷键是可选的,但建议使用。我们将在稍后的步骤中为这些菜单项添加代码。

步骤4:创建SplitContainer1

注意: 使用 FpSpread 并不一定需要添加拆分器,但 SplitContainer 控件使创建友好且灵活的电子表格界面变得更加容易,因为它会自动处理电子表格、名称框和公式文本框控件的大小调整,而无需任何代码。

在 工具箱 ( CTRL+ALT+X ) 中,展开Containers类别 ,然后双击 SplitContainer 控件以创建 splitContainer1

 

拆分容器工具箱

步骤5:配置SplitContainer1

在 “属性” 窗口 ( F4 ) 中,对于 splitContainer1,将 Orientation设置 为 Horizo​​ntal,然后将 Panel1MinSize 和 SplitterDistance设置 为 23

SplitContainer 1 属性

 

电子表格将位于底部窗格中,编辑栏界面将位于顶部窗格中,拆分器将确定FormulaTextBox控件的高度,  以显示换行的长公式。

第6步:创建SplitContainer2

在 工具箱 ( CTRL+ALT+X ) 中,将新的SplitContainer拖放 到splitContainer1的  顶部窗格 ( Panel1 ) 内 以创建 splitContainer2

拆分容器 2

在 “属性” 窗口 ( F4 ) 中,对于 splitContainer2,将Panel1MinSize 和 SplitterDistance 设置  为 150

SplitContainer2 属性

第 7 步:创建 FpSpread

在 “解决方案资源管理器”中,展开 “解决方案 SpreadNetQuickStart” 和 “项目 SpreadNetQuickStart”,然后右键单击 “依赖项” 并选择 “管理 NuGet 包...”  (或按 ALT+P+N+N+N+ENTER):

管理 NuGet 包

 

然后,在NuGet Package Manager中,选择  左上角的 Browse ,然后 在搜索框中 键入Spread.WinForms以查找最新的GrapeCity.Spread.WinForms,然后单击 Install

NuGet 包管理器

 

安装 GrapeCity.Spread.WinForms后,继续安装 GrapeCity.Spread.WinForms.Design  – 该软件包包含 fpSpreadDesigner 组件,用于在运行时显示 Spread Designer 工具。

然后,在工具箱 ( CTRL+ALT+X ) 中,选择 FpSpread 控件:

 

FpSpread工具箱

最后,将FpSpread的实例绘制 到SplitContainer1的 底部窗格 ( Panel2 ) 中。当您创建控件时, Spread 设计器工具  可能会打开(这是默认行为) - 现在,  如果出现 ,请关闭Spread 设计器。

 

Fp传播形式

使用 属性网格 (F4),将 Dock 属性设置为 Fill:

 

FpSpread 扩展坞

第 8 步:创建名称框

在 工具箱 ( CTRL+ALT+X ) 中,展开GrapeCity Spread for WinForms的类别  ,然后选择 NameBox 控件:

名称框工具箱

 在左上角的 Panel1  ( SplitContiner2.Panel1 ) 内绘制一个新的 NameBox

姓名框表格

在 “属性” 窗口 ( F4 ) 中,对于 nameBox1,将Dock 设置  为 Fill

名称框属性

在nameBox1的右上角 ,单击指示器打开 NameBox Tasks,然后单击 AttachTo 下拉列表并选择 fpSpread1  – 这将以代码隐藏形式生成代码,以将 NameBox 控件附加到 FpSpread 控件:

 

名称框附件

第 9 步:创建 FormulaTextBox

在 工具箱 ( CTRL+ALT+X ) 中,展开 容器 并选择 面板 控件:

面板工具箱

 

在Panel2内 ( NameBox1 右侧 ),绘制一个新的 Panel

面板 2 表格

在 “属性” 窗口 ( F4 ) 中,对于 panel1,将BorderStyle 设置  为 FixSingle 并将 Dock设置 为 Fill

面板 1 属性

在 工具箱 (CTRL+ALT+X) 中, 选择 FormulaTextBox 控件:

公式文本框工具箱

在panel1  (位于 splitContainer2.Panel2内部)内 ,绘制一个新的FormulaTextBox 控件:

公式文本框表单

在 FormulaTextBox1 的属性 窗口 ( F4 ) 中,将BorderStyle 设置  为 None 并将 Dock设置 为 Fill

公式文本框属性

在FormulaTextBox1的右上角 ,单击指示器打开 FormulaTextBox 任务, 然后单击 AttachTo 下拉列表并选择 fpSpread1  – 这将以代码隐藏形式生成代码,以将 FormulaTextBox 控件附加到 FpSpread控件:

公式文本框附件

步骤 10:创建 WinForms 电子表格设计器组件

现在,在Toolbox 窗口 ( CTRL+ALT+X ) 的 GrapeCity Spread Design for WinForms 类别下  双击 FpSpreadDesigner组件以 在表单中 创建一个新的 FpSpreadDesigner :

FpSpread 设计器工具箱

刚刚添加的fpSpreadDesigner1组件  应显示在组件 menuStrip1 fpSpread1_Sheet1旁边的表单组件托盘中:

FpSpread 设计器表单

步骤 11:为文件菜单项创建事件处理程序

文件菜单处理程序设计

对于“文件”菜单中的每个菜单项  ,在设计视图中双击该菜单项,直到每个菜单项都有一个在 VB 或 C# 代码中生成的关联菜单处理程序:

文件菜单处理程序

第 12 步:添加事件处理程序代码

复制以下代码来实现事件处理程序:

[C#]

添加事件处理程序代码 C#

private string mFileName = null;

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "CSV file (*.csv)|*.csv| All Files (*.*)|*.*";
    ofd.FilterIndex = 0;
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        mFileName = ofd.FileName;
        fpSpread1.Sheets[0].LoadTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "");
        saveToolStripMenuItem.Enabled = true;
    }
}

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
    fpSpread1.Sheets[0].SaveTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "");
}

private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "CSV file (*.csv)|*.csv| All Files (*.*)|*.*";
    sfd.FilterIndex = 0;
    sfd.FileName = mFileName;
    if (sfd.ShowDialog() == DialogResult.OK)
    {
        mFileName = sfd.FileName;
        fpSpread1.Sheets[0].SaveTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "");
        saveToolStripMenuItem.Enabled = true;
    }
}

private void designToolStripMenuItem_Click(object sender, EventArgs e)
{
    fpSpreadDesigner1.ShowDialog(fpSpread1);
}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
    DialogResult ret = MessageBox.Show("Do you want to save this file before closing?", "Save Spreadsheet", MessageBoxButtons.YesNoCancel);
    if (ret == DialogResult.Cancel)
        return;
    else if (ret == DialogResult.Yes)
        saveToolStripMenuItem_Click(null, EventArgs.Empty);
    Close();
}
复制

[VB]

添加事件处理程序代码 VB

Private mFileName As String = Nothing

Private Sub OpenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem.Click
    Dim ofd As New OpenFileDialog
    ofd.Filter = "CSV file (*.csv)|*.csv| All Files (*.*)|*.*"
    ofd.FilterIndex = 0
    If ofd.ShowDialog() = DialogResult.OK Then
        mFileName = ofd.FileName
        FpSpread1.Sheets(0).LoadTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "")
        SaveToolStripMenuItem.Enabled = True
    End If
End Sub

Private Sub SaveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveToolStripMenuItem.Click
    FpSpread1.Sheets(0).SaveTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "")
End Sub

Private Sub SaveAsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveAsToolStripMenuItem.Click
    Dim sfd As SaveFileDialog = New SaveFileDialog()
    sfd.Filter = "CSV file (*.csv)|*.csv| All Files (*.*)|*.*"
    sfd.FilterIndex = 0
    sfd.FileName = mFileName
    If sfd.ShowDialog() = DialogResult.OK Then
        mFileName = sfd.FileName
        FpSpread1.Sheets(0).SaveTextFile(mFileName, FarPoint.Win.Spread.TextFileFlags.None, FarPoint.Win.Spread.Model.IncludeHeaders.None, "", ",", "")
        SaveToolStripMenuItem.Enabled = True
    End If
End Sub

Private Sub DesignToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DesignToolStripMenuItem.Click
    FpSpreadDesigner1.ShowDialog(FpSpread1)
End Sub

Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
    Dim ret As DialogResult = MessageBox.Show("Do you want to save this file before closing?", "Closing", MessageBoxButtons.YesNoCancel)
    If ret = DialogResult.Cancel Then
        Return
    ElseIf ret = DialogResult.Yes Then
        SaveToolStripMenuItem_Click(Nothing, EventArgs.Empty)
    End If
    Close()
End Sub
复制

文件 - 打开的代码  使用 OpenFileDialog 浏览 CSV 文件,然后使用 FpSpread.Sheets.LoadTextFile方法打开选定的 CSV 文件。文件 - 保存的代码 使用 FpSpread.Sheets.SaveTextFile将电子表格数据保存到 CSV,文件- 另存为的代码 使用 SaveFileDialog 允许用户将文件保存到另一个位置或使用另一个名称。此功能允许 C# 或 VB.NET CSV 文件导入和导出。

File-Design 中的代码使用 FpSpreadDesigner.ShowDialog 方法在运行时显示 Spread Designer 工具,进行更改,然后将这些更改应用回表单中的电子表格实例。最后, “文件 - 退出”中的代码  提示用户是否保存文件,然后使用 Close 方法关闭窗体。

准备好构建和运行!

最终结果

该项目已准备好构建和运行。文件设计菜单将  在运行时打开Spread Designer工具,如上所示,它可以将更改应用于表单中运行的电子表格实例。了解 Spread .NET 如何让您能够在应用程序中使用 C# 或 VB.NET 将电子表格导入和导出为 CSV。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django的可重用HTML模板示例

01-配置并运行Django项目 首先按照博文 https://blog.csdn.net/wenhao_ir/article/details/131166889配置并运行Django项目。 02-创建可重用模板文件 templates目录下新建目录common,然后在目录common下新建文件:navbar.html,并写入下面的…

火山引擎 ByteHouse 的增强型数据导入技术实践

作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。 数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。…

【LLM】基于LLM的agent应用(更新中)

note 在未来,Agent 还会具备更多的可扩展的空间。 就 Observation 而言,Agent 可以从通过文本输入来观察来理解世界到听觉和视觉的集成;就 Action 而言,Agent 在具身智能的应用场景下,对各种器械进行驱动和操作。 Age…

maptalks三维地图网址

三维 地址: http://examples.maptalks.com/examples/cn/gltf/gltf-marker/shader

【漏洞复现】浙大恩特CRM文件上传0day

漏洞描述 浙大恩特客户资源管理系统任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用…

表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;) 📜表白墙/留言墙初级Spring Boot项目(此篇博客的简略版,不带MyBatis数据库开发) 目录 1、项目前端页面及项目…

C/C++ 运用WMI接口查询系统信息

Windows Management Instrumentation(WMI)是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口,通过这个接口,可以获取有关计算机系统硬件、操作系统和应用程序的信息&#xf…

nodejs微信小程序-利康药房管理系统的设计与实现- 安卓-python-PHP-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【Redux】Redux 基本使用

1. Redux 快速上手 Redux 是 React 最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行。 <button id"decrement">-</button> <span id"count">0</span> <…

2023年汉字小达人市级比赛在线模拟题更新:40分钟150题完整对标

今天是2023年11月19日&#xff0c;距离11月30日的汉字小达人市级比赛还有11天。许多孩子正在利用难得的周末抓紧练习和备赛。 结合一些孩子的反馈和需求&#xff0c;我把150题的在线模拟题做了更新&#xff0c;增加了前面的个人信息填写的部分&#xff0c;并且把整个试卷的完成…

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

从0开始学习JavaScript--JavaScript 数字与日期

JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算&#xff0c;以及日期对象的创建、格式化等操作&#xff0c;并通过丰富的示例代码&#xff0c;可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…

供应链|顶刊MSOM论文解读:服务竞争下的库存共享

问题背景 在汽车、玩具等行业中&#xff0c;零售商之间的库存共享变得十分常见。库存共享可以解决由需求不确定导致的库存错配问题。如果零售商之间同意共享库存&#xff0c;那么当需求较少、自身库存过剩时&#xff0c;可以将过剩库存卖给其他零售商&#xff1b;反之&#xf…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

Dart 3.2 更新,Flutter Web 的未来越来越明朗

参考原文&#xff1a;https://medium.com/dartlang/dart-3-2-c8de8fe1b91f 本次跟随 Flutter 3.16 发布 的 Dart 3.2 &#xff0c;包含有&#xff1a;私有 final 字段的非空改进、新的 interop 改进、对 DevTools 中的扩展支持、以及对 Web 路线图的更新&#xff0c;包括对 Was…

LCD1602显示自定义字符

代码&#xff1a; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); //根据lcd1602的地址修改0x27. dht DHT; byte degree[8] {B00100, B01010, B10001, B10101, B10101, B01110, B00100,B00100 }; //自定义字符的2进制数据 byte customCh…

Shell脚本:Linux Shell脚本学习指南(第一部分Shell基础)一

你好&#xff0c;欢迎来到「Linux Shell脚本」学习专题&#xff0c;你将享受到免费的 Shell 编程资料&#xff0c;以及很棒的浏览体验。 这套 Shell 脚本学习指南针对初学者编写&#xff0c;它通俗易懂&#xff0c;深入浅出&#xff0c;不仅讲解了基本知识&#xff0c;还深入底…

optee4.0.0 qemu_v8的环境搭建篇(ubuntu20.10)

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈文章目录 前提条件1、拉取代码2、下载工具链3、编译4、运行

Linux系统无法发送组播消息

临时方法&#xff0c;执行系统命令 sudo route add -net 组播ip netmask 255.255.255.255 dev 网卡设备名此方法只是临时生效&#xff0c;机器重启或者拔掉网线后都会失效&#xff0c;需要重新执行该命令才行&#xff0c;下面介绍用就方法&#xff0c;重启和拔网线后依然生效&…