using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.IO;
using System.Reflection;
namespace Logica.Excel
{
public static class ExcelLogica
{
public static List<object> Leer(string archivo)
{
var lista = new List<object>();
List<List<string>> samples = new List<List<string>>();
try
{
int selCount = 0;
var document = SpreadsheetDocument.Open(archivo, false);
var workbookPart =
document.WorkbookPart;
var sheets =
workbookPart.Workbook.Descendants<Sheet>();
var fila =
1;
foreach (Sheet sheet in sheets)
{
var workSheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet;
var sheetData =
workSheet.Elements<SheetData>().First();
List<Row> rows = sheetData.Elements<Row>().ToList();
var columnas =
rows.ElementAt(0).Elements<Cell>().Count();
var b = new string[columnas];
foreach (Row row in rows)
{
var indice = 0;
b = new string[columnas];
foreach (Cell c in row.Elements<Cell>())
{
var value = "";
if (c != null)
{
value = c.InnerText;
if (c.DataType != null)
{
switch (c.DataType.Value)
{
case CellValues.SharedString:
// For shared
strings, look up the value in the
// shared strings
table.
var stringTable =
workbookPart.GetPartsOfType<SharedStringTablePart>()
.FirstOrDefault();
// If the shared
string table is missing, something
// is wrong. Return the index
that is in
// the cell.
Otherwise, look up the correct text in
// the table.
if (stringTable != null)
{
value =
stringTable.SharedStringTable
.ElementAt(int.Parse(value)).InnerText;
}
break;
case CellValues.Boolean:
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
break;
}
}
b[indice] = value;
indice++;
}
}
fila++;
lista.Add(b);
}
}
} catch (Exception ex)
{}
return lista;
}
public static byte[] GenerarOpenXml(DataTable t, string autofiltro)
{
MemoryStream stream = new MemoryStream();
using (SpreadsheetDocument myWorkbook =
SpreadsheetDocument.Create(stream,
SpreadsheetDocumentType.Workbook, true))
{
WorkbookPart workbookPart =
myWorkbook.AddWorkbookPart();
var worksheetPart =
workbookPart.AddNewPart<WorksheetPart>();
string relId =
workbookPart.GetIdOfPart(worksheetPart);
var fileVersion = new FileVersion { ApplicationName = "Microsoft Office
Excel" };
var sheets = new Sheets();
var sheet = new Sheet { Name = t.TableName, SheetId = 1,
Id = relId };
sheets.Append(sheet);
SheetData sheetData = new SheetData(CreateSheetData(t));
var workbook = new Workbook();
workbook.Append(fileVersion);
workbook.Append(sheets);
var worksheet = new Worksheet();
worksheet.Append(sheetData);
AutoFilter autoFilter1 = null;
if (autofiltro != null)
{
autoFilter1 = new AutoFilter() { Reference = autofiltro };
worksheet.Append(autoFilter1);
}
worksheetPart.Worksheet = worksheet;
myWorkbook.WorkbookPart.Workbook = workbook;
myWorkbook.WorkbookPart.Workbook.Save();
myWorkbook.Close();
return stream.ToArray();
}
}
public static byte[] GenerarOpenXml<T>(this IEnumerable<T> collection, string autofiltro)
{
var t = ToDataTable(collection, "Subdiario");
return GenerarOpenXml(t, autofiltro);
}
public static MemoryStream BuildExcel(DataTable dataTable, string autofiltro)
{
MemoryStream stream = new MemoryStream();
using (SpreadsheetDocument myWorkbook =
SpreadsheetDocument.Create(stream,
SpreadsheetDocumentType.Workbook, true))
{
WorkbookPart workbookPart =
myWorkbook.AddWorkbookPart();
var worksheetPart =
workbookPart.AddNewPart<WorksheetPart>();
string relId = workbookPart.GetIdOfPart(worksheetPart);
var fileVersion = new FileVersion { ApplicationName = "Microsoft Office
Excel" };
var sheets = new Sheets();
var sheet = new Sheet { Name = dataTable.TableName,
SheetId = 1, Id = relId };
sheets.Append(sheet);
SheetData sheetData = new SheetData(CreateSheetData(dataTable));
var workbook = new Workbook();
workbook.Append(fileVersion);
workbook.Append(sheets);
var worksheet = new Worksheet();
worksheet.Append(sheetData);
AutoFilter autoFilter1 = null;
if (autofiltro != null)
{
autoFilter1 = new AutoFilter() { Reference = autofiltro };
worksheet.Append(autoFilter1);
}
worksheetPart.Worksheet = worksheet;
myWorkbook.WorkbookPart.Workbook = workbook;
myWorkbook.WorkbookPart.Workbook.Save();
myWorkbook.Close();
return stream;
}
}
private static List<OpenXmlElement> CreateSheetData(DataTable dataTable)
{
List<OpenXmlElement> elements = new List<OpenXmlElement>();
var rowHeader = new Row();
Cell[] cellsHeader = new Cell[dataTable.Columns.Count];
for (int i = 0; i <
dataTable.Columns.Count; i++)
{
cellsHeader[i] = new Cell();
cellsHeader[i].DataType = CellValues.String;
cellsHeader[i].CellValue
= new CellValue(dataTable.Columns[i].ColumnName);
}
rowHeader.Append(cellsHeader);
elements.Add(rowHeader);
foreach (DataRow rowDataTable in dataTable.Rows)
{
var row = new Row();
Cell[] cells = new Cell[dataTable.Columns.Count];
for (int i = 0; i <
dataTable.Columns.Count; i++)
{
cells[i] = new Cell();
if (dataTable.Columns[i].DataType
== System.Type.GetType("System.Decimal"))
cells[i].DataType = CellValues.Number;
else if (dataTable.Columns[i].DataType ==
System.Type.GetType("System.DateTime"))
cells[i].DataType = CellValues.Date;
else
cells[i].DataType = CellValues.String;
cells[i].CellValue = new CellValue(rowDataTable[i].ToString());
}
row.Append(cells);
elements.Add(row);
}
return elements;
}
public static DataTable ToDataTable<T>(this IEnumerable<T> collection, string tableName)
{
DataTable tbl = ToDataTable(collection);
tbl.TableName = tableName;
return tbl;
}
public static DataTable ToDataTable<T>(this IEnumerable<T> collection)
{
DataTable dt = new DataTable();
Type t = typeof(T);
PropertyInfo[] pia = t.GetProperties();
object temp;
DataRow dr;
for (int i = 0; i < pia.Length; i++)
{
dt.Columns.Add(pia[i].Name, Nullable.GetUnderlyingType(pia[i].PropertyType) ??
pia[i].PropertyType);
dt.Columns[i].AllowDBNull = true;
}
//Populate the table
foreach (T item in collection)
{
dr = dt.NewRow();
dr.BeginEdit();
for (int i = 0; i < pia.Length; i++)
{
temp = pia[i].GetValue(item, null);
if (temp == null || (temp.GetType().Name == "Char" && ((char)temp).Equals('\0')))
{
dr[pia[i].Name] = (object)DBNull.Value;
}
else
{
dr[pia[i].Name] = temp;
}
}
dr.EndEdit();
dt.Rows.Add(dr);
}
return dt;
}
}
}
No hay comentarios:
Publicar un comentario