305 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using DocumentFormat.OpenXml.Packaging;
 | ||
| using DocumentFormat.OpenXml.Spreadsheet;
 | ||
| using Foresight.Data;
 | ||
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.Data;
 | ||
| using System.IO;
 | ||
| using System.Linq;
 | ||
| using System.Text;
 | ||
| using System.Threading.Tasks;
 | ||
| 
 | ||
| namespace IronIntel.Contractor.ExportExcel
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// Excel 导入。提供对xlsx文件的解析
 | ||
|     /// </summary>
 | ||
|     public class ImportFromExcel
 | ||
|     {
 | ||
|         /// <summary>
 | ||
|         /// 解析excel数据
 | ||
|         /// </summary>
 | ||
|         /// <param name="excelBytes">Excel Data</param>
 | ||
|         /// <returns></returns>
 | ||
|         public DataTable LoadExcelData(byte[] excelBytes, int headerrowindex = 1)
 | ||
|         {
 | ||
|             return LoadExcelData(excelBytes, "", headerrowindex);
 | ||
|         }
 | ||
| 
 | ||
|         public DataTable[] LoadAllExcelData(byte[] excelBytes)
 | ||
|         {
 | ||
|             MemoryStream stream = null;
 | ||
|             List<DataTable> list = new List<DataTable>();
 | ||
|             try
 | ||
|             {
 | ||
|                 stream = new MemoryStream(excelBytes);
 | ||
|                 using (SpreadsheetDocument sdoc = SpreadsheetDocument.Open(stream, false))
 | ||
|                 {
 | ||
|                     foreach (Sheet sheet in sdoc.WorkbookPart.Workbook.Descendants<Sheet>())
 | ||
|                     {
 | ||
|                         if (sheet != null)
 | ||
|                         {
 | ||
|                             WorksheetPart wsp = (WorksheetPart)sdoc.WorkbookPart.GetPartById(sheet.Id);
 | ||
|                             Worksheet ws = wsp.Worksheet;
 | ||
|                             //取Cell值的时候使用
 | ||
|                             SharedStringTablePart tablePart = sdoc.WorkbookPart.SharedStringTablePart;
 | ||
|                             //得到第一个工作表的所有行
 | ||
|                             IEnumerable<Row> rows = ws.Descendants<Row>();
 | ||
|                             //第一行是标题,标题作为表的列名
 | ||
|                             Row headerRow = rows.First();
 | ||
|                             DataTable excelData = new DataTable(sheet.Name);
 | ||
|                             string columnName = "";
 | ||
|                             foreach (Cell hc in headerRow)
 | ||
|                             {
 | ||
|                                 columnName = GetCellValue(hc, tablePart);
 | ||
|                                 excelData.Columns.Add(columnName, GetCellDataType(hc));
 | ||
|                             }
 | ||
|                             //装载数据到DataTable里面
 | ||
|                             foreach (Row row in rows)
 | ||
|                             {
 | ||
|                                 if (row.RowIndex == 1) continue;
 | ||
|                                 DataRow excelRow = excelData.NewRow();
 | ||
|                                 int i = 0;
 | ||
|                                 foreach (Cell cell in row)
 | ||
|                                 {
 | ||
|                                     excelRow[i] = GetCellValue(cell, tablePart);
 | ||
|                                     i++;
 | ||
|                                 }
 | ||
|                                 excelData.Rows.Add(excelRow);
 | ||
|                             }
 | ||
|                             list.Add(excelData);
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             catch
 | ||
|             {
 | ||
|                 //解析过程中出错误了,TODO
 | ||
|             }
 | ||
|             finally
 | ||
|             {
 | ||
|                 if (stream != null) stream.Close();
 | ||
|             }
 | ||
|             return list.ToArray();
 | ||
|         }
 | ||
| 
 | ||
|         public DataTable LoadExcelDataByClient(byte[] excelBytes)
 | ||
|         {
 | ||
|             DataTable[] dts = ExcelClient.GetTables(excelBytes, true, true);
 | ||
| 
 | ||
|             if(dts != null && dts.Length > 0)
 | ||
|             {
 | ||
|                 return dts[0];
 | ||
|             }
 | ||
|             return null;
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 解析excel数据
 | ||
|         /// </summary>
 | ||
|         /// <param name="excelBytes">Excel Data</param>
 | ||
|         /// <param name="sheetName">Sheet Name</param>
 | ||
|         /// <returns></returns>
 | ||
|         public DataTable LoadExcelData(byte[] excelBytes, string sheetName, int headerrowindex)
 | ||
|         {
 | ||
|             MemoryStream stream = null;
 | ||
|             try
 | ||
|             {
 | ||
|                 stream = new MemoryStream(excelBytes);
 | ||
|                 using (SpreadsheetDocument sdoc = SpreadsheetDocument.Open(stream, false))
 | ||
|                 {
 | ||
|                     Sheet sheet = null;
 | ||
|                     if (string.IsNullOrEmpty(sheetName))//没有特定的sheetname的时候,取第一个sheet
 | ||
|                         sheet = sdoc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
 | ||
|                     else//根据sheetname取特定sheet
 | ||
|                         sheet = sdoc.WorkbookPart.Workbook.Descendants<Sheet>().Where((s) => s.Name == sheetName).First();
 | ||
|                     if (sheet != null)
 | ||
|                     {
 | ||
|                         WorksheetPart wsp = (WorksheetPart)sdoc.WorkbookPart.GetPartById(sheet.Id);
 | ||
|                         WorkbookStylesPart stylepart = sdoc.WorkbookPart.GetPartsOfType<WorkbookStylesPart>().FirstOrDefault();
 | ||
|                         Worksheet ws = wsp.Worksheet;
 | ||
|                         //取Cell值的时候使用
 | ||
|                         SharedStringTablePart tablePart = sdoc.WorkbookPart.SharedStringTablePart;
 | ||
|                         //得到第一个工作表的所有行
 | ||
|                         IEnumerable<Row> rows = ws.Descendants<Row>();
 | ||
|                         //第一行是标题,标题作为表的列名
 | ||
|                         Row headerRow = rows.ElementAt(headerrowindex - 1);//.First();
 | ||
|                         DataTable excelData = new DataTable(sheet.Name);
 | ||
|                         string columnName = "";
 | ||
|                         foreach (Cell hc in headerRow)
 | ||
|                         {
 | ||
|                             columnName = GetCellValue(hc, tablePart);
 | ||
|                             excelData.Columns.Add(columnName, GetCellDataType(hc));
 | ||
|                             if (hc.CellReference != null)
 | ||
|                             {
 | ||
|                                 var colref = System.Text.RegularExpressions.Regex.Replace(hc.CellReference.Value, @"\d", "");//C30->C
 | ||
|                                 excelData.Columns[excelData.Columns.Count - 1].Caption = colref;
 | ||
|                             }
 | ||
|                         }
 | ||
|                         
 | ||
|                         //装载数据到DataTable里面
 | ||
|                         foreach (Row row in rows)
 | ||
|                         {
 | ||
|                             if (row.RowIndex <= headerrowindex) continue;
 | ||
|                             DataRow excelRow = excelData.NewRow();
 | ||
|                             int i = 0;
 | ||
|                             foreach (Cell cell in row)
 | ||
|                             {
 | ||
|                                 if (cell.CellReference != null)//row不包含未输入的单元
 | ||
|                                 {
 | ||
|                                     var colref = System.Text.RegularExpressions.Regex.Replace(cell.CellReference.Value, @"\d", "");//C30->C
 | ||
|                                     int j = i;
 | ||
|                                     while (j < excelData.Columns.Count && excelData.Columns[j].Caption != colref)
 | ||
|                                     {
 | ||
|                                         j++;
 | ||
|                                     }
 | ||
|                                     if (excelData.Columns[j].Caption == colref)
 | ||
|                                     {
 | ||
|                                         excelRow[j] = GetCellValue(cell, tablePart, stylepart);
 | ||
|                                     }
 | ||
|                                 }
 | ||
|                                 else
 | ||
|                                 {
 | ||
|                                     excelRow[i] = GetCellValue(cell, tablePart, stylepart);
 | ||
|                                 }
 | ||
|                                 i++;
 | ||
|                             }
 | ||
|                             excelData.Rows.Add(excelRow);
 | ||
|                         }
 | ||
|                         return excelData;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception ex)
 | ||
|             {
 | ||
|                 //解析过程中出错误了,TODO
 | ||
|             }
 | ||
|             finally
 | ||
|             {
 | ||
|                 if (stream != null) stream.Close();
 | ||
|             }
 | ||
|             return null;
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 得到Excel 中 Cell的值
 | ||
|         /// </summary>
 | ||
|         /// <param name="c">Cell</param>
 | ||
|         /// <param name="stp"></param>
 | ||
|         /// <returns></returns>
 | ||
|         private string GetCellValue(Cell cell, SharedStringTablePart stringTablePart, WorkbookStylesPart stylepart = null)
 | ||
|         {
 | ||
|             if (cell.ChildElements.Count == 0) return "";
 | ||
|             string value = cell.CellValue.InnerText;
 | ||
|             if (cell.DataType != null && cell.DataType == CellValues.SharedString)
 | ||
|             {
 | ||
|                 value = stringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText;
 | ||
|             }
 | ||
|             else if (cell.StyleIndex != null && cell.StyleIndex > 0 && stylepart != null)
 | ||
|             {
 | ||
|                 try
 | ||
|                 {
 | ||
|                     //int formatStyleIndex = Convert.ToInt32(cell.StyleIndex.Value);
 | ||
|                     //CellFormat cf = (CellFormat)stylepart.Stylesheet.CellFormats.ElementAt(formatStyleIndex);
 | ||
| 
 | ||
|                     //if (cf.NumberFormatId != null)
 | ||
|                     //{
 | ||
|                     //    var numberFormatId = cf.NumberFormatId.Value;
 | ||
|                     //    if (stylepart.Stylesheet.NumberingFormats != null)
 | ||
|                     //    {
 | ||
|                     //        var numberingFormat = stylepart.Stylesheet.NumberingFormats.Cast<NumberingFormat>().Single(f => f.NumberFormatId.Value == numberFormatId);
 | ||
|                     //        if(numberingFormat != null)
 | ||
|                     //        {
 | ||
|                     //            double dd = 0;
 | ||
|                     //            if (double.TryParse(value, out dd))
 | ||
|                     //            {
 | ||
|                     //                return dd.ToString(numberingFormat.FormatCode.Value);
 | ||
|                     //            }
 | ||
|                     //        }
 | ||
|                     //    }
 | ||
|                     //}
 | ||
|                     //else
 | ||
|                     //{
 | ||
|                     //    value = cell.InnerText;
 | ||
|                     //}
 | ||
|                     double d = 0;
 | ||
|                     if (double.TryParse(value, out d))
 | ||
|                     {
 | ||
|                         value = d.ToString();
 | ||
|                         CellFormat cf = (CellFormat)stylepart.Stylesheet.CellFormats.ElementAt((int)cell.StyleIndex.Value);
 | ||
|                         if (cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22)//Date
 | ||
|                         {
 | ||
|                             value = DateTime.FromOADate(d).ToString("M/d/yyyy");
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|                 catch { }
 | ||
|             }
 | ||
|             return value;
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 得到单元格类型
 | ||
|         /// </summary>
 | ||
|         /// <param name="cell">Cell</param>
 | ||
|         /// <returns></returns>
 | ||
|         private Type GetCellDataType(Cell cell)
 | ||
|         {
 | ||
|             if (cell.DataType == null) return typeof(string);
 | ||
|             if (cell.DataType == CellValues.Date)
 | ||
|                 return typeof(DateTime);
 | ||
|             if (cell.DataType == CellValues.Number)
 | ||
|                 return typeof(decimal);
 | ||
|             return typeof(string);
 | ||
|         }
 | ||
|         public string[] LoadExcelColumnHead(byte[] excelBytes, int headerrowindex = 1)
 | ||
|         {
 | ||
|             return LoadExcelColumnHead(excelBytes, "", headerrowindex);
 | ||
|         }
 | ||
| 
 | ||
|         public string[] LoadExcelColumnHead(byte[] excelBytes, string sheetName, int headerrowindex)
 | ||
|         {
 | ||
|             MemoryStream stream = null;
 | ||
|             try
 | ||
|             {
 | ||
|                 stream = new MemoryStream(excelBytes);
 | ||
|                 using (SpreadsheetDocument sdoc = SpreadsheetDocument.Open(stream, false))
 | ||
|                 {
 | ||
|                     Sheet sheet = null;
 | ||
|                     if (string.IsNullOrEmpty(sheetName))//没有特定的sheetname的时候,取第一个sheet
 | ||
|                         sheet = sdoc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
 | ||
|                     else//根据sheetname取特定sheet
 | ||
|                         sheet = sdoc.WorkbookPart.Workbook.Descendants<Sheet>().Where((s) => s.Name == sheetName).First();
 | ||
|                     if (sheet != null)
 | ||
|                     {
 | ||
|                         WorksheetPart wsp = (WorksheetPart)sdoc.WorkbookPart.GetPartById(sheet.Id);
 | ||
|                         Worksheet ws = wsp.Worksheet;
 | ||
|                         //取Cell值的时候使用
 | ||
|                         SharedStringTablePart tablePart = sdoc.WorkbookPart.SharedStringTablePart;
 | ||
|                         //得到第一个工作表的所有行
 | ||
|                         IEnumerable<Row> rows = ws.Descendants<Row>();
 | ||
|                         //第一行是标题,标题作为表的列名
 | ||
|                         Row headerRow = rows.ElementAt(headerrowindex - 1);//.First();
 | ||
|                         List<string> ls = new List<string>();
 | ||
|                         foreach (Cell hc in headerRow)
 | ||
|                         {
 | ||
|                             string columnName = "";
 | ||
|                             columnName = GetCellValue(hc, tablePart);
 | ||
|                             ls.Add(columnName);
 | ||
|                         }
 | ||
| 
 | ||
|                         return ls.ToArray();
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception ex)
 | ||
|             {
 | ||
|                 //解析过程中出错误了,TODO
 | ||
|             }
 | ||
|             finally
 | ||
|             {
 | ||
|                 if (stream != null) stream.Close();
 | ||
|             }
 | ||
|             return null;
 | ||
|         }
 | ||
|     }
 | ||
| }
 |