废不多,直入正题。

所需环境:安装了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的更多相关文章

  1. Android手机上,利用bat脚本模拟用户操作

    ………… 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行 ...

  2. 西门子触摸屏利用VBScript脚本创建csv文件

    功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...

  3. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  4. java利用poi导出数据到excel

    背景: 上一篇写到利用jtds连接数据库获取对应的数据,本篇写怎样用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** ...

  5. 利用Python脚本悄无声息的遥控室友电脑开机密码!

    整蛊一下室友就行了,切勿用于非法用途! 利用python脚本控制室友windows系统电脑的开机密码.利用random()生成随机数(密码),天知地知,密码只有你自己知道! Python代码分为cli ...

  6. 利用python脚本(xpath)抓取数据

    有人会问re和xpath是什么关系?如果你了解js与jquery,那么这个就很好理解了. 上一篇:利用python脚本(re)抓取美空mm图片 # -*- coding:utf-8 -*- from ...

  7. ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类

    ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:读取文本文件,常见多边形要素 ...

  8. linux下redis4.0.2集群部署(利用Ruby脚本命令)

    一.原生命令方式和Ruby脚本方式区别 利用Ruby脚本部署和用原生命令部署,节点准备的步骤都是一样的,节点启动后的握手,以及主从.槽分配,利用Ruby脚本一步就能完成,利用原生命令需要一步一步地执行 ...

  9. 利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下

    背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/data/images/).后来访问量大了,图片也多了,这样就影响读取效率.所以有个这样的需求,把这些个图片文件移 ...

随机推荐

  1. .NETFramework:Random

    ylbtech-.NETFramework:Random 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c ...

  2. ng2父子模块通信@ViewChild和@Inject

    一.@ViewChild 父组件中使用@ViewChild拿到子组件的变量和方法(父组件可调用子组件的方法和变量) parent.component.ts: import { Component, O ...

  3. 【251】◀▶IEW-Unit16

    Unit 16 Commodities and Manufacturered Goods 多幅饼图的写作技巧 1.model1对应图片分析 2.Model1范文分析 Model 1 The pie c ...

  4. Open Live Writer测试

    ************************我是可爱的分界线***************************

  5. 塞尔达:旷野之息个人对比上古卷轴V:天际

    上古卷轴5是我之前玩过最优秀的作品.玩塞尔达的时候就有跟上古卷轴5比对,真的都是神作.两个游戏的自由度都是真的高. 主线剧情上,老滚5印象不深了,当时就知道战斗,只记住了开头砍头现场,还有奥杜因这个龙 ...

  6. editplus怎么在前后插入字符

    快捷键:ctrl+h 未编辑之前: 源: 一:行首批量添加   查找"^" 替换为“我是行首aaa” 二: 行尾批量添加   查找"\n" 替换为“'bbb我是 ...

  7. 转:isualvm远程监控Tomcat

    一.Java VisualVM 概述 对于使用命令行远程监控jvm 太麻烦 . 在jdk1.6 中 Oracle 提供了一个新的可视化的. JVM 监控工具 Java VisualVM .jvisua ...

  8. android学习点滴一:android环境的搭建

    东一点西一点,很多时间都浪费了.是该系统性的做好自己的东西了. <android学习点滴一:android环境的搭建> [环境变量]变量名:JAVA_HOME变量值:C:\Java\jdk ...

  9. XXX.h:143: error: expected declaration specifiers or ‘...’ before ‘YYY’

    出现上面头文件错误,原因是定义YYY的头和XXX.h互相包含了

  10. OSP 与 Session

    大家都知道,OSP是不支持session的,换句话说,登录有效期是永久的.一般网站,如果你不操作一段时间以后,必须重新登录.osp不是这样的,你一旦登录后,即便服务器重启了,你依然能访问服务器并不需要 ...