C#关于 Excel文件转DataTable、转TXT文本的实现
C#关于 Excel文件转DataTable、转TXT文本的实现
FileToDataTable
/// <summary> /// /// </summary> /// <param name="fileName">文件的路径Path+FileName</param> /// <param name="sheetName">页签名</param> /// <returns></returns> private DataTable FileToDataTable(string fileName, string sheetName) { DataSet dst = new DataSet(); DataTable dt = new DataTable(); dt = XlsToDataTable(fileName, sheetName); return dt; }
XlsToDataTable
需要引用NPOL.dll
public DataTable XlsToDataTable(string vFilePath, string vSheetName) { DataTable dataTable = new DataTable(); Stream stream = null; try { stream = File.OpenRead(vFilePath); HSSFWorkbook hssfworkbook = new HSSFWorkbook(stream); HSSFSheet hssfsheet = (HSSFSheet)hssfworkbook.GetSheet(vSheetName); HSSFRow hssfrow = (HSSFRow)hssfsheet.GetRow(0); int lastCellNum = (int)hssfrow.LastCellNum; for (int i = (int)hssfrow.FirstCellNum; i < lastCellNum; i++) { DataColumn column = new DataColumn(hssfrow.GetCell(i).StringCellValue); dataTable.Columns.Add(column); } dataTable.TableName = vSheetName; int lastRowNum = hssfsheet.LastRowNum; for (int i = hssfsheet.FirstRowNum + 1; i <= hssfsheet.LastRowNum; i++) { HSSFRow hssfrow2 = (HSSFRow)hssfsheet.GetRow(i); DataRow dataRow = dataTable.NewRow(); for (int j = (int)hssfrow2.FirstCellNum; j < lastCellNum; j++) { dataRow[j] = hssfrow2.GetCell(j).ToString(); } dataTable.Rows.Add(dataRow); } stream.Close(); } catch (Exception ex) { throw new Exception("Xls to DataTable: \n" + ex.Message); } finally { if (stream != null) { stream.Close(); } } return dataTable; }
另外一种方法:
/* *引用 NuGet包 Spire.XLS */ /// <summary> /// Excel帮助类 /// </summary> public class ExcelHelper { /// <summary> /// 将Excel以文件流转换DataTable /// </summary> /// <param name="hasTitle">是否有表头</param> /// <param name="path">文件路径</param> /// <param name="tableindex">文件簿索引</param> public DataTable ExcelToDataTableFormPath(bool hasTitle = true, string path = "", int tableindex = 0) { //新建Workbook Workbook workbook = new Workbook(); //将当前路径下的文件内容读取到workbook对象里面 workbook.LoadFromFile(path); //得到第一个Sheet页 Worksheet sheet = workbook.Worksheets[tableindex]; return SheetToDataTable(hasTitle, sheet); } /// <summary> /// 将Excel以文件流转换DataTable /// </summary> /// <param name="hasTitle">是否有表头</param> /// <param name="stream">文件流</param> /// <param name="tableindex">文件簿索引</param> public DataTable ExcelToDataTableFormStream(bool hasTitle = true, Stream stream = null, int tableindex = 0) { //新建Workbook Workbook workbook = new Workbook(); //将文件流内容读取到workbook对象里面 workbook.LoadFromStream(stream); //得到第一个Sheet页 Worksheet sheet = workbook.Worksheets[tableindex]; return SheetToDataTable(hasTitle, sheet); } private DataTable SheetToDataTable(bool hasTitle, Worksheet sheet) { int iRowCount = sheet.Rows.Length; int iColCount = sheet.Columns.Length; DataTable dt = new DataTable(); //生成列头 for (int i = 0; i < iColCount; i++) { var name = "column" + i; if (hasTitle) { var txt = sheet.Range[1, i + 1].Text; if (!string.IsNullOrEmpty(txt)) name = txt; } while (dt.Columns.Contains(name)) name = name + "_1";//重复行名称会报错。 dt.Columns.Add(new DataColumn(name, typeof(string))); } //生成行数据 int rowIdx = hasTitle ? 2 : 1; for (int iRow = rowIdx; iRow <= iRowCount; iRow++) { DataRow dr = dt.NewRow(); for (int iCol = 1; iCol <= iColCount; iCol++) { dr[iCol - 1] = sheet.Range[iRow, iCol].Text; } dt.Rows.Add(dr); } return RemoveEmpty(dt); } /// <summary> /// 去除空行 /// </summary> /// <param name="dt"></param> /// <returns></returns> private DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new List<DataRow>(); for (int i = 0; i < dt.Rows.Count; i++) { bool rowdataisnull = true; for (int j = 0; j < dt.Columns.Count; j++) { if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim())) { rowdataisnull = false; } } if (rowdataisnull) { removelist.Add(dt.Rows[i]); } } for (int i = 0; i < removelist.Count; i++) { dt.Rows.Remove(removelist[i]); } return dt; } }
DataTableToTxt
public object DataTableToTxt(DataTable vContent, string vOutputFilePath) { object resObj; StringBuilder sTxtContent; try { if (File.Exists(vOutputFilePath)) File.Delete(vOutputFilePath); sTxtContent = new StringBuilder(); //数据 foreach (DataRow row in vContent.Rows) { for (int i = 0; i < vContent.Columns.Count; i++) { sTxtContent.Append(row[i].ToString().Trim()); sTxtContent.Append(i == vContent.Columns.Count - 1 ? "\r\n" : "\t"); } } File.WriteAllText(vOutputFilePath, sTxtContent.ToString(), Encoding.Unicode); resObj = new object[] { 0, "OK" }; } catch (Exception ex) { resObj = new object[] { 0, "OK" }; } return resObj; }
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/12745748.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。