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;
|
|
}
|
|
}
|
|
}
|