C# 解析 Excel 并且生成 Csv 文件代码分析
作者:omuying 发布时间:2021-11-09 18:04:04
今天工作中遇到一个需求,就是获取 excel 里面的内容,并且把 excel 另存为 csv,因为本人以前未接触过,所以下面整理出来的代码均来自网络,具体参考链接已丢失,原作者保留所有权利!
例子:
using System;
using System.Data;
namespace ExportExcelToCode
{
class ExcelOperater
{
public void Operater()
{
// Excel 路径
string excelPath = "";
// Csv 存放路径
string csvPath = "";
// 获取 Excel Sheet 名称列表
string[] sheetNameList = ExcelUtils.GetSheetNameList(excelPath);
if (sheetNameList != null && sheetNameList.Length > 0)
{
foreach (string sheetName in sheetNameList)
{
string itemName = sheetName.TrimEnd(new char[] { '$' });
// 解析 Excel 为 DataTable 对象
DataTable dataTable = ExcelUtils.ExcelToDataTable(excelPath, itemName);
if (dataTable != null && dataTable.Rows.Count > 0)
{
// 生成 Csv 文件
ExcelUtils.ExcelToCsv(excelPath, csvPath, itemName, "|#|", 0);
}
}
}
}
}
}
ExcelUtils.cs 文件
using System;
using System.Data;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
namespace ExportExcelToCode
{
public partial class ExcelUtils
{
/// <summary>
/// 获取 Sheet 名称
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string[] GetSheetNameList(string filePath)
{
try
{
string connectionText = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + "Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
System.Data.OleDb.OleDbConnection oleDbConnection = new System.Data.OleDb.OleDbConnection(connectionText);
oleDbConnection.Open();
System.Data.DataTable dataTable = oleDbConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); ;
string[] sheetNameList = new string[dataTable.Rows.Count];
for (int index = 0; index < dataTable.Rows.Count; index++)
{
sheetNameList[index] = dataTable.Rows[index][2].ToString();
}
oleDbConnection.Close();
return sheetNameList;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// Excel 转 DataTable
/// </summary>
/// <param name="filePath"></param>
/// <param name="sheetName"></param>
/// <returns></returns>
public static System.Data.DataTable ExcelToDataTable(string filePath, string sheetName)
{
try
{
string connectionText = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + "Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
string selectText = string.Format("select * from [{0}$]", sheetName);
DataSet dataSet = new DataSet();
System.Data.OleDb.OleDbConnection oleDbConnection = new System.Data.OleDb.OleDbConnection(connectionText);
oleDbConnection.Open();
System.Data.OleDb.OleDbDataAdapter oleDbDataAdapter = new System.Data.OleDb.OleDbDataAdapter(selectText, connectionText);
oleDbDataAdapter.Fill(dataSet, sheetName);
oleDbConnection.Close();
return dataSet.Tables[sheetName];
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// Excel 转 Csv
/// </summary>
/// <param name="sourceExcelPathAndName"></param>
/// <param name="targetCSVPathAndName"></param>
/// <param name="excelSheetName"></param>
/// <param name="columnDelimeter"></param>
/// <param name="headerRowsToSkip"></param>
/// <returns></returns>
public static bool ExcelToCsv(string sourceExcelPathAndName, string targetCSVPathAndName, string excelSheetName, string columnDelimeter, int headerRowsToSkip)
{
Excel.Application oXL = null;
Excel.Workbooks workbooks = null;
Workbook mWorkBook = null;
Sheets mWorkSheets = null;
Worksheet mWSheet = null;
try
{
oXL = new Excel.Application();
oXL.Visible = false;
oXL.DisplayAlerts = false;
workbooks = oXL.Workbooks;
mWorkBook = workbooks.Open(sourceExcelPathAndName, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
mWorkSheets = mWorkBook.Worksheets;
mWSheet = (Worksheet)mWorkSheets.get_Item(excelSheetName);
Excel.Range range = mWSheet.UsedRange;
Excel.Range rngCurrentRow;
for (int i = 0; i < headerRowsToSkip; i++)
{
rngCurrentRow = range.get_Range("A1", Type.Missing).EntireRow;
rngCurrentRow.Delete(XlDeleteShiftDirection.xlShiftUp);
}
range.Replace("\n", " ", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
range.Replace(",", columnDelimeter, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
mWorkBook.SaveAs(targetCSVPathAndName, Excel.XlFileFormat.xlCSV,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, false);
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
if (mWSheet != null) mWSheet = null;
if (mWorkBook != null) mWorkBook.Close(Type.Missing, Type.Missing, Type.Missing);
if (mWorkBook != null) mWorkBook = null;
if (oXL != null) oXL.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);
if (oXL != null) oXL = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
}
}
需要特别指出的是:需要在项目中添加 Microsoft.Office.Interop.Excel.dll 文件,具体操作:选中引用->右键添加引用->浏览找到 Microsoft.Office.Interop.Excel,添加引用。


猜你喜欢
- 消息发送过程消息的发送可能会经过 * 、序列化、分区器等过程。消息发送的主要涉及两个线程,分别为main线程和sender线程。如图所示,主
- 判断一个数是不是回文数示例,回文数就是原数与其倒置后的数相等,如:123321,到之后仍为123321,即为回文数题目:一个5位数,判断它是
- JSON字符串和java对象的互转【json-lib】在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON
- MyBatis注解实现动态SQL在 Mybatis 中,使用注解可以很方便的进行sql操作,但很多动态 SQL 都是由 xml 配置实现的。
- 工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式。android中用到了太多的工厂类,其中有用工厂方
- Actuator简介监控分类Actuator 提供Rest接口,展示监控信息。接口分为三大类:应用配置类:获取应用程序中加载的应用配置、环境
- Collection遍历方式Collection集合遍历的方式有三种:迭代器foreach/增强for循环lambda表达式迭代器遍历迭代器
- 本文实例总结了java判断字符串是否为数字的方法。分享给大家供大家参考,具体如下:方法一:用JAVA自带的函数public static b
- 平时我们编写WinForm程序经常使用VS进行拖控件的方式,这样做虽然简单,但是无法深入了解WinForm程序的本质。其实,用记事本也可以编
- Android:Field can be converted to a local varible.的解决办法前言:使用 Android S
- 本文实例为大家分享了Java实现高校教务系统的具体代码,供大家参考,具体内容如下需求:建立一个教务管理系统,为学生和教师提供不同的功能//简
- 本文实例讲述了spring AOP的After增强实现方法。分享给大家供大家参考,具体如下:一 配置<?xml version=&qu
- 本文实例讲述了C#使用Ado.net读取Excel表的方法。分享给大家供大家参考。具体分析如下:微软NET提供了一个交互的方法,通过使用AD
- 本文所述实例实现将一张图片上传到指定的文件夹,然后在窗体上的PictrueBox控件中显示出来。具体功能代码如下:private void
- 提到java里的注解,和我们平时的注释还是有很大的区别,主要是作为java特性来使用的,跟我们常见的类是同一个使用的层面。关于java注解的
- 今天遇到一个问题,原来用的好好的asp网页无法打开,同时inetinfo.exe的CPU占用率很高,几乎达到了100%。看了一下系统错误日志
- 在上一篇文章中,我们实现了统计每个产品和地区的销售额,如果现在需要统计每个产品和地区所占市场份额的百分比,那么使用堆叠条形图是不合适的,我们
- 根据中国的国情,宽带共享遭受dns污染和HTTP拦截非常严重,造成网络请求的不稳定.但是ip/tcp协议一般不受影响。因此可以把域名先解析成
- 本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能。分享给大家供大家参考,具体如下:前面一篇
- Mybatis防止sql注入原理SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL 语句 * 入到执行的实体字段中(例如,为