用C#写一个Excel转Txt的小工具

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

using Microsoft.Office.Core;

using Excel = Microsoft.Office.Interop.Excel;

namespace excel_test
{
    class Program
    {

        // 获得字段的实际最大长度
        static int GetMaxLength(DataTable dt, string captionName)
        {
           DataColumn maxLengthColumn = new DataColumn();
           maxLengthColumn.ColumnName = "MaxLength";
           maxLengthColumn.Expression = String.Format("len(convert({0},‘System.String‘))", captionName);
           dt.Columns.Add(maxLengthColumn);
           object maxLength = dt.Compute("max(MaxLength)", "true");
           dt.Columns.Remove(maxLengthColumn);

           return Convert.ToInt32(maxLength);
        }

        static void convertExcelToTxt(string inputFile, string outputPath)
        {
            string newFileName = Path.GetFileNameWithoutExtension(inputFile) + ".txt";
            string newFile = outputPath + "\\" +newFileName;
            Console.WriteLine("Convert file[{0}] to [{1}]", inputFile, newFile);

            FileStream fs = new FileStream(newFile, FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(fs);

            var conn = new OleDbConnection();
            conn.ConnectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;" +
                @"Data Source={0}" +
                ";Extended Properties=\"Excel 12.0 Xml;HDR=No\"", inputFile);
            conn.Open();
            OleDbDataAdapter da = new OleDbDataAdapter("select * from [Sheet1$]", conn);
            var ds = new DataSet();
            da.Fill(ds);
            var tb1 = ds.Tables[0];

            foreach (DataRow row in tb1.Rows)
            {
                for (int j = 0; j < tb1.Columns.Count; ++j)
                {
                    DataColumn col = tb1.Columns[j];
                    string fmt = String.Format("{0}0,-{1}{2}", "{", GetMaxLength(tb1, col.Caption) + 2, "}");
                    sw.Write(fmt, row[j]);
                    Console.Write(fmt, row[j]);
                }
                sw.WriteLine();
                Console.WriteLine();
            }
            sw.Close();
        }

        static int Main(string[] args)
        {
            if(args.Length < 1)
            {
                Console.WriteLine("No input file arg.");
                return -1;
            }
            string inputFile = args[0];
            if (!File.Exists(inputFile))
            {
                Console.WriteLine("No input file exist, {0}", inputFile);
                return -1;
            }

            string fileName = Path.GetFileName(inputFile);
            string outputPath;
            if (args.Length > 1)
            {
                outputPath = args[1];
            }
            else
            {
                outputPath = Path.GetDirectoryName(inputFile);
            }
            if (!Directory.Exists(outputPath))
            {
                Console.WriteLine("Output directory not exist, {0}.", outputPath);
                return -1;
            }
            convertExcelToTxt(inputFile, outputPath);
            return 0;
        }
    }
}

参考:
1. 【C#读取Excel 2010】,汪宇杰
2. 【C#格式化字符串中转义大括号“{}”】, ^_^肥仔John
3. 【浅谈  DataSet   的用法

时间: 2024-10-02 10:55:50

用C#写一个Excel转Txt的小工具的相关文章

用php写一个管理外借设备的小工具--技术提高生产力

我学网站编程属于半途出家的类型,本是搞运维的,进了现在的公司后意识到学习一门编程语言的重要性,便从平时的工作时间里抽出部分来做学习和练习. 公司做技术的都是属于编程出身的,从网站设计到手机程式设计,好像大多数的人都在走这样的一条道路. 公司的部分业务是做手机游戏开发的,测试设备也越来越多,管理权归我们运维两个人所有,一直以来都是用个小笔记本做外借的登记,每天都有不同的测试人员过来借设备,ipad,iphone,android机,借了又还,还了另外一个人过来借,不用多久,那笔记本已经累积到厚厚的一

发布一个关于SharePoint的管理小工具

源码地址:  https://github.com/GavinHacker/SiteCollectionManager 这是一个C#可执行程序,用于添加,删除,备份,还原SharePoint站点,可以查看一些SharePoint数据属性,比如SharePoint ContentTypes ,Columns等等,层级到List级别. 这个Tool是开始接触SharePoint不久写的,最初由于有很多用于开发的站点占用很多的资源,直接删掉还担心之后会用到,借助STSADMIN写了这个有备份功能的工具

一个我自己用的小工具

最近一段时间,事越来越多,要做的事情越来越多,需要的工具越来越多, 好多工具都要自己写,所以我又把我以前写的一个脚本工具弄出来了, 一个小的脚本工具,能做几乎所有事情,(就是有些简单有些麻烦而以), 打开之后,界面是这样的 这个脚本工具是基于lua 脚本的,因为我感觉lua更简单,小巧,便捷, 虽然也有一些不足,但是比那些个什么什么奇葩的强迫症脚本,比如python友善一些. 内部支持一些内建的命令,来做一些相关的辅助操作 输入一个"?"会列出全部内建命令,有些说明可能不正确,有些命令

Qt写的文件拆分和融合小工具

最近因事物需要,需要将大文件分解为几个小文件,然后就行传输,在接收端需要对接收到的小文件进行融合.因此用Qt写了这个小工具.现在奉献上这个小工具的代码和思路. 我们知道任何文件在计算机上都是二进制数据块,因此只需要使用读写二进制的形式来读取大文件,在将读取的大文件以二进制形式写入小文件,这样就可以将文件拆分了(当然这是非常简单的拆分方法,对有些文件肯定存在错误的,因为本人在这方面的知识很肤浅).同样小文件的融合就是拆分的逆过程. 在读写文件的过程中我使用的是C++标准库ifstream和ofst

初学Python-搞了一个linux用户登录监测小工具

这几天突发奇想,想学习一下Python.看了点基础,觉得有点枯燥,所以想搞点什么.想了想,就随便弄个检测Linux用户登录的小工具吧~ 首先,明确一下功能: 1.能够捕获 linux 用户登录的信息.(这个很容易,方法比较多) 2.能够将捕捉的信息记录下来.(不然要这信息干嘛……) 3.最好能够一发现有人登陆,就给管理员发个邮件.(这个功能比较实用~) 4.没想好.(功能可以不断完善嘛) 嗯,那现在就要着手解决技术难点了(对我来说可能是难点吧,毕竟才看了几天书……). 1.捕获linux登录信息

python的实战:一个目录一键启动管理小工具

简单的学习了几天的python,总觉得最好根据自身的需求来做点小工具实战一下. 上班的时候由于有很多目录需要打开.每次都要一个个的找那些目录.我觉得,我需要一个小工具.然后登记下,所有需要打开的目录.然后可以很方便的一键打开所有的目录或者是有哪些文件.然后登记一下.可以一次性打开所有登记的目标每次打开工具时,需要读取xml的数据.每增加一条数据要写入到xml中.这样我们即使部使用辅助工具去添加记录.直接修改xml文件的数据来增加记录也是可以的.具体实现如下 import os import xm

JDBCUtils,一个操作关系型数据库的小工具

先贴代码 1 public class SqlC3p0Utils { 2 private static ComboPooledDataSource dataSource; 3 static{ 4 ResourceBundle bundle=ResourceBundle.getBundle("db");//获得配置文件对象 5 dataSource = new ComboPooledDataSource();//获得连接池对象 6 //根据配置文件队连接池进行配置 7 try { 8 d

一个清理VS工程的小工具

VS工程编译完之后会产生大量的临时文件,这个小程序就是清理VS工程残留文件的,能迅速清理VS的工程,如果有子文件夹递归进行清理,程序使用多线程效率很高. /* * filename: main.cpp * author: lougd * created: 2014-12-26 10:25 * version: 1.0.0.1 * desc: clear vs project * version: * history: */ #include <Windows.h> #include <s

excel转txt工具

有个任务需要读好多eccel,实际读起来并不方便,变手工把ecxcel转换成文本文档,心累....于是闲暇写了个ecxcel转txt的小工具.主要是用的Spreadsheet::XLSX. use strict;use warnings;use strict; use Spreadsheet::XLSX;die "Usage :perl $0 <xlsx> <resultDIR>\n" unless @ARGV==2; ####需要输入需要转换的ecxel文件