利用C#脚本来处理Excel
废不多,直入正题。
所需环境:安装了Windows操作系统和Office软件的电脑一台。
开发语言:C#
开发需求:1.利用C#脚本读取Excel .xlsx文件
2.将程序中的数据存储到.csv文件当中
可以看到,我们的项目完全脱离了IDE,这也方便大家能够进行快速的开发。毕竟有的时候手边的计算机不一定安装了vs这样的集成开发环境。那么我们首先就要自己去找到C#的编译器:
csc.exe 一般位于:C:\Windows\Microsoft.NET\Framework 选择一个版本 文件夹下。可以将这个目录放到环境变量path中去,以便于在命令窗口快速使用:

如上图所示即证明csc环境已经配置好。编译器已经有了,下面我们还需要一个处理Excel所需的动态库,这个库可以在Office软件的安装目录中找到,名字叫做:
Microsoft.Office.Interop.Excel.dll 把它复制出来一份 。
新建一个文件夹,把刚才找到的dll放到这个文件夹下,然后在这个文件夹下创建一个.cs C#脚本,如 excelexecutor.cs
1.用编辑器打开,然后添加指令集:
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.IO; using Excel = Microsoft.Office.Interop.Excel; using System.Data.OleDb; using System.Runtime.InteropServices;
2.创建命名空间和类,并在类中加载动态库:
namespace rockderia
{
public class Program
{
[DllImport("kernel32.dll")]
private static extern IntPtr _lopen(string lpPathName, int iReadWrite);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
;
private const int OF_SHARE_DENY_NONE = 0x40;
);
}
}
3.编写第一个静态函数:检测文件是否已经被打开。
功能说明:如果其他的程序打开了某个Excel文件,原则上这个Excel文件将不会被更改。所以这里写这个函数专门用来检测。如果文件已经被打开,那么将不会对它执行操作。
public static int FileIsOpen(string fileFullName)
{
if(!File.Exists(fileFullName))
{
;
}
IntPtr handle = _lopen(fileFullName, OF_READWRITE | OF_SHARE_DENY_NONE);
if (handle == HFILE_ERROR)
{
;
}
CloseHandle(handle);
;
}
4.编写第二个静态函数:加载Excel文件:
[1]Excel文件中可能有多个表格,就是下方的sheet1 sheet2本个例子先只操作sheet1
[2]表格的第一行一般默认为标题 在strCon字符串中有一项属性HDR设置成NO的话确实可以将标题当数据读出,但是可能会出错!所以不建议那么做,而是单独的将标题读取在一个返回值中。其余的列装到一个返回值中。额外的返回值可以用out 参数来处理。
[3]函数开始前调用上边的方法检测文件状态。
[4]filePath是要读取的文件的路径
函数声明如下:
public static List<string[]> loading(string filePath, out List<string> retHead)
具体代码
public static List<string[]> loading(string filePath, out List<string> retHead)
{
)
{
Console.WriteLine("文件在其他位置已经被打开!");
retHead = new List<string>();
return null;
}
else
{
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=2'";
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open();
//返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等
DataTable dtSheetName = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
//包含excel中表名的字符串数组
//这块处理的是表的集合和名字,也就是excel下方的角标处的列表(例如sheet1 sheet2)。将所有的表的名字存在strTableNames当中了。
string[] strTableNames = new string[dtSheetName.Rows.Count];
; k < dtSheetName.Rows.Count; k++)
{
strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
}
] + "]"; ;
//这里开始,针对表0进行操作(即第一个表 如sheet1)。
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, strTableNames[]);
List<string[]> retList = new List<string[]>();
retHead = new List<string>();
//标题数据需要像这样额外获取 存储在List<string>中
; i < myDataSet.Tables[].Columns.Count; i++)
{
retHead.Add(myDataSet.Tables[].Columns[i].ToString());
}
//获取非标题的各行数据 存储在List<string[]>中
DataTable dt = myDataSet.Tables[];
foreach (DataRow r in dt.Rows)
{
int colCount = r.ItemArray.Count();
string[] items = new string[colCount];
; i < colCount; i++)
{
items[i] = Convert.ToString(r.ItemArray[i]);
}
retList.Add(items);
}
myConn.Close();
return retList;
}
}
5.编写静态方法,生成一个.csv文件
[1]这个静态方法写入.csv文件的所有数据,需要存储在DataTable结构中,可以用下面的例子简单构造:
DataTable dt1 = new DataTable();
dt1.Columns.Add("姓名");
dt1.Columns.Add("年龄");
dt1.Columns.Add("性别");
dt1.Columns.Add("??");
; i < ; i++)
{
DataRow dw = dt1.NewRow();
dw["姓名"] = "阿卡林";
dw["年龄"] = "阿卡林";
dw["性别"] = "阿卡林";
dw["??"] = "阿卡林";
dt1.Rows.Add(dw);
}
其中Columns就是标题行中各个列的标题。
写文件函数代码如下:
public static bool DataToExcel(DataTable m_DataTable, string file_new_path)
{
string FileName = file_new_path;
if (FileName == "")
{
Console.WriteLine("文件路径错误!");
return false;
}
else
{
if (File.Exists(FileName))
File.Delete(FileName);
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine = "";
objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
; i < m_DataTable.Columns.Count; i++)
{
strLine = strLine + m_DataTable.Columns[i].Caption.ToString() + Convert.ToChar();
}
objStreamWriter.WriteLine(strLine);
strLine = "";
; i < m_DataTable.Rows.Count; i++)
{
; j < m_DataTable.Columns.Count; j++)
{
if (m_DataTable.Rows[i].ItemArray[j] == null)
strLine = strLine + );
else
{
string rowstr = "";
rowstr = m_DataTable.Rows[i].ItemArray[j].ToString();
)
rowstr = rowstr.Replace("\r\n", " ");
)
rowstr = rowstr.Replace("\t", " ");
strLine = strLine + rowstr + Convert.ToChar();
}
}
objStreamWriter.WriteLine(strLine);
strLine = "";
}
objStreamWriter.Close();
objFileStream.Close();
return true;
}
这样,读写的功能就都有了,可以编写一个Main函数来测试这两个方法亦或是执行一系列的逻辑,这里就不多提了,最后就是编译了。
一般来说编译一个.cs文件 这个.cs要有Main函数就可以了,但是本例中使用到了动态库,所以编译的命令应该是
csc /r:Microsoft.Office.Interop.Excel.dll .\excelexecutor.cs
编译完成后,excelexecutor.exe就可以直接执行了~
利用C#脚本来处理Excel的更多相关文章
- Android手机上,利用bat脚本模拟用户操作
………… 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行 ...
- 西门子触摸屏利用VBScript脚本创建csv文件
功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...
- 利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...
- java利用poi导出数据到excel
背景: 上一篇写到利用jtds连接数据库获取对应的数据,本篇写怎样用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** ...
- 利用Python脚本悄无声息的遥控室友电脑开机密码!
整蛊一下室友就行了,切勿用于非法用途! 利用python脚本控制室友windows系统电脑的开机密码.利用random()生成随机数(密码),天知地知,密码只有你自己知道! Python代码分为cli ...
- 利用python脚本(xpath)抓取数据
有人会问re和xpath是什么关系?如果你了解js与jquery,那么这个就很好理解了. 上一篇:利用python脚本(re)抓取美空mm图片 # -*- coding:utf-8 -*- from ...
- ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类
ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:读取文本文件,常见多边形要素 ...
- linux下redis4.0.2集群部署(利用Ruby脚本命令)
一.原生命令方式和Ruby脚本方式区别 利用Ruby脚本部署和用原生命令部署,节点准备的步骤都是一样的,节点启动后的握手,以及主从.槽分配,利用Ruby脚本一步就能完成,利用原生命令需要一步一步地执行 ...
- 利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下
背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/data/images/).后来访问量大了,图片也多了,这样就影响读取效率.所以有个这样的需求,把这些个图片文件移 ...
随机推荐
- Spring入门第十八课
Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或者基于XML配置的AOP 看代码: package lo ...
- GridView ,后台修改 跟新完毕,前端 未跟新处理
//Response.Redirect(Request.Url.ToString());//重新定位 GridView_dept.DataBind(); //重新绑定都可以
- JAVA企业级开发-jdbc事务,数据库连接池(10)
一. JDBC事务 事务: 问题1.什么是事务 问题2.java中(jdbc)如何控制事务 1. 事务—重点 指的的逻辑上的一组(一组sql,insert update ,delete)操作,组成 ...
- 洛谷 P2327 [SCOI2005]扫雷
P2327 [SCOI2005]扫雷 https://www.luogu.org/problem/show?pid=2327 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二 ...
- 【TIDB】4、业界使用情况
一.小米 1.背景 小米关系型存储数据库首选 MySQL,单机 2.6T 磁盘.由于小米手机销量的快速上升和 MIUI 负一屏用户量的快速增加,导致负一屏快递业务数据的数据量增长非常快, 每天的读写量 ...
- 关于 Overtrue 的拼音库 overtrue/pinyin 为何 travis 为 error
什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+).Thin ...
- C 语言实例 - 斐波那契数列
C 语言实例 - 斐波那契数列 斐波那契数列指的是这样一个数列 , , , , , , , , , , , , ,,,,,,,,,,,........ 这个数列从第3项开始,每一项都等于前两项之和. ...
- vue教程3-webpack搭建项目
vue-cli https://cli.vuejs.org/zh/ vue-cli是vue的命令行工具,对于创建项目,安装各种组件,运行项目都极为方便,是在开发vue中的必备工具 vue-cli基于n ...
- [LOJ 2082] 「JSOI2016」炸弹攻击 2
[LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...
- POJ3694 Network 边双缩点+LCA+并查集
辣鸡错误:把dfs和ldfs搞混...QAQ 题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数. 先把边双缩点,然后预处理出LCA的倍增数组: 然后加边时,从u往上跳 ...