// 1 定义类
using System; using System.Net; using System.Windows; using System.Windows.Data; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Reflection.Emit; using System.Reflection; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using System.IO; using System.Xml.Linq; using System.Linq; using System.Windows.Navigation; namespace SLApplicationMadaming.Views.第2部分调试.MSOfficeExcel导入导出 { public static class DataSourceCreator { private static readonly Regex PropertNameRegex = new Regex(@"^[A-Za-z]+[A-Za-z1-9_]*$",RegexOptions.Singleline); public static IEnumerable ToDataSource(this IEnumerable<IDictionary> list) { IDictionary firstDict = null; bool hasData = false; foreach (IDictionary currentDict in list) { hasData = true; firstDict = currentDict; break; } if (!hasData) { return new object[] { }; } if (firstDict == null) { throw new ArgumentException("IDictionary entry cannot be null"); } Type objectType = null; TypeBuilder tb = GetTypeBuilder(list.GetHashCode()); ConstructorBuilder constructor = tb.DefineDefaultConstructor( MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName); foreach (DictionaryEntry pair in firstDict) { //if (PropertNameRegex.IsMatch(Convert.ToString(pair.Key),0)) // { CreateProperty(tb,Convert.ToString(pair.Key),pair.Value == null ? typeof(object) : pair.Value.GetType()); /* } else { throw new ArgumentException() ; }*/ } objectType = tb.CreateType(); return GenerateEnumerable(objectType,list,firstDict); } private static IEnumerable GenerateEnumerable( Type objectType,IEnumerable<IDictionary> list,IDictionary firstDict) { var listType = typeof(List<>).MakeGenericType(new[] { objectType }); var listofCustom = Activator.CreateInstance(listType); foreach (var currentDict in list) { if (currentDict == null) { throw new ArgumentException("IDictionary entry cannot be null"); } var row = Activator.CreateInstance(objectType); foreach (DictionaryEntry pair in firstDict) { if (currentDict.Contains(pair.Key)) { PropertyInfo property = objectType.GetProperty(Convert.ToString(pair.Key)); property.SetValue( row,Convert.ChangeType( currentDict[pair.Key],property.PropertyType,null),null); } } listType.getmethod("Add").Invoke(listofCustom,new[] { row }); } return listofCustom as IEnumerable; } private static TypeBuilder GetTypeBuilder(int code) { AssemblyName an = new AssemblyName("TempAssembly" + code); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( an,AssemblyBuilderAccess.Run); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); TypeBuilder tb = moduleBuilder.DefineType("TempType" + code,TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout,typeof(object)); return tb; } private static void CreateProperty( TypeBuilder tb,string propertyName,Type propertyType) { FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName,propertyType,FieldAttributes.Private); PropertyBuilder propertyBuilder = tb.DefineProperty( propertyName,PropertyAttributes.HasDefault,null); MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName,MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,Type.EmptyTypes); ILGenerator getIL = getPropMthdBldr.GetILGenerator(); getIL.Emit(OpCodes.Ldarg_0); getIL.Emit(OpCodes.Ldfld,fieldBuilder); getIL.Emit(OpCodes.Ret); MethodBuilder setPropMthdBldr = tb.DefineMethod("set_" + propertyName,MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,null,new Type[] { propertyType }); ILGenerator setIL = setPropMthdBldr.GetILGenerator(); setIL.Emit(OpCodes.Ldarg_0); setIL.Emit(OpCodes.Ldarg_1); setIL.Emit(OpCodes.Stfld,fieldBuilder); setIL.Emit(OpCodes.Ret); propertyBuilder.Setgetmethod(getPropMthdBldr); propertyBuilder.SetSetMethod(setPropMthdBldr); } } public class madamingWorksheet { /// <summary> /// worksheet_name:工作表名 /// header_name:表头名表 /// header_key:表头bind键值表 /// headers:表头 /// rows: 表值表 /// </summary> string _worksheet_name; List<string> _header_values = new List<string>(); List<string> _header_keys = new List<string>(); List<List<string>> _headers = new List<List<string>>(); List<string> _row = new List<string>(); List<List<string>> _rows = new List<List<string>>(); #region 属性 public string WorksheetName { get { return _worksheet_name; } set { _worksheet_name = value; } } public List<string> HeaderValues { get { return _header_values; } } public List<string> HeaderKeys { get { return _header_keys; } } public List<List<string>> Headers { get { _headers.Clear(); //_header_keys.Clear(); //for (int i = 0; i < _header_values.Count(); i++) //{ // string bind_path = string.Format("B{0:D2}",i); // _header_keys.Add(bind_path); //} _headers.Add(_header_keys); _headers.Add(_header_values); return _headers; } } public List<List<string>> Rows { get { return _rows; } } #endregion } public class madamingExcelXMLWorkSheetImport { #region 内部成员 private Stream _excel_xml_stream; private XDocument xdoc2; madamingWorksheet _worksheet; List<madamingWorksheet> _worksheets = new List<madamingWorksheet>(); List<string> row; bool loadingHeaders = false; object[] objects = new object[2]; #endregion #region 属性 public List<madamingWorksheet> WorkSheets { get { return _worksheets; } } #endregion #region 方法 #region - 构造方法 public madamingExcelXMLWorkSheetImport(Stream excel_xml_stream) { _excel_xml_stream = excel_xml_stream; xdoc2 = XDocument.Load(_excel_xml_stream); browserXElement(xdoc2.Elements()); } #endregion #region 一般方法 private void browserXElement(IEnumerable<XElement> xelements) { foreach (XElement e in xelements) { if (e.Name.LocalName == "Workbook") { browserWorkbook(e.Elements()); } } } private void browserWorkbook(IEnumerable<XElement> xelements) { foreach (XElement e in xelements) { if (e.Name.LocalName == "Worksheet") { _worksheet = new madamingWorksheet(); if (e.HasAttributes) { foreach (XAttribute a in e.Attributes()) { if (a.Name.LocalName == "Name") { _worksheet.WorksheetName = a.Value; break; } } } browserWorksheet(e.Elements()); _worksheets.Add(_worksheet); } } } private void browserWorksheet(IEnumerable<XElement> xelements) { foreach (XElement e in xelements) { if (e.Name.LocalName == "Table") { browserTable(e.Elements()); } } } private void browserTable(IEnumerable<XElement> xelements) { //int c = xelements.Count(); int row_count = 0; foreach (XElement e in xelements) { if (e.Name.LocalName == "Row") { browserRow(row_count,e.Elements()); row_count++; } } } private void browserRow(int row_number,IEnumerable<XElement> xelements) { int cell_count = 0; if (row_number == 0) { /// /// 处理首行列名 /// _worksheet.HeaderValues.Clear(); _worksheet.HeaderKeys.Clear(); foreach (XElement e in xelements) { if (e.Name.LocalName == "Cell") { browserHeaderCell(cell_count,e.Elements()); cell_count++; } } } else { /// /// 后续行表值 /// row = new List<string>(); foreach (XElement e in xelements) { if (e.Name.LocalName == "Cell") { browserValueCell(cell_count,e.Elements()); cell_count++; } } _worksheet.Rows.Add(row); } } private void browserHeaderCell(int cell_number,IEnumerable<XElement> xelements) { string s1; string s2; foreach (XElement e in xelements) { if (e.Name.LocalName == "Data") { _worksheet.HeaderValues.Add(e.Value); string bind_path = string.Format("B{0:D2}",_worksheet.HeaderValues.Count()-1); _worksheet.HeaderKeys.Add(bind_path); if (e.HasAttributes) { foreach (XAttribute a in e.Attributes()) { s1 = a.Name.LocalName; s2 = a.Value; ; } } } } } private void browserValueCell(int cell_number,IEnumerable<XElement> xelements) { string s1; string s2; string value; if (xelements.Count() > 0) { foreach (XElement e in xelements) { if (e.Name.LocalName == "Data") { value = e.Value; row.Add(value); if (e.HasAttributes) { foreach (XAttribute a in e.Attributes()) { s1 = a.Name.LocalName; s2 = a.Value; ; } } } } } else { value = string.Format("cell:{0}",cell_number); row.Add(value); } } private IEnumerable<IDictionary> GenerateData(int worksheet_index) { var values = _worksheets[worksheet_index].HeaderValues;// Headers.First(); var key = _worksheets[worksheet_index].HeaderKeys;// Headers.Last(); foreach (List<string> row in _worksheets[worksheet_index].Rows) { var dict = new Dictionary<string,object>(); for (int j = 0; j < key.Count(); j++) { dict[key[j]] = row[j]; } yield return dict; } } private void GeerateDataGridHeaders(DataGrid datagrid_显示,int worksheet_index ) { var values = _worksheets[worksheet_index].HeaderValues;// Headers.First(); var key = _worksheets[worksheet_index].HeaderKeys;// Headers.Last(); if (loadingHeaders == false) { datagrid_显示.Columns.Clear(); datagrid_显示.AutoGenerateColumns = false; for (int i = 0; i < key.Count(); i++) { DataGridTextColumn c = new DataGridTextColumn(); c.Header = values[i]; c.Binding = new Binding(key[i]); datagrid_显示.Columns.Add(c); loadingHeaders = true; } } } public void GenerateDataGridData(DataGrid datagrid_显示,int worksheet_index) { GeerateDataGridHeaders(datagrid_显示,worksheet_index); datagrid_显示.ItemsSource = GenerateData(worksheet_index).ToDataSource(); } #endregion #endregion } }
<navigation:Page xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="SLApplicationMadaming.Views.第2部分调试.Page_MSOfficeExcel导入导出" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="Page_MSOfficeExcel导入导出 Page"> <navigation:Page.Resources > <Style x:Key="hyperlinkbutton_style" targettype="HyperlinkButton" > <Setter Property="VerticalAlignment" Value="Center" ></Setter> <Setter Property="Margin" Value="10 0"></Setter> <Setter Property="Foreground" Value="Blue" ></Setter> </Style> </navigation:Page.Resources> <Grid x:Name="LayoutRoot"> <Grid.RowDeFinitions> <RowDeFinition Height="25"></RowDeFinition> <RowDeFinition Height="*"></RowDeFinition> <RowDeFinition Height="25"></RowDeFinition> </Grid.RowDeFinitions> <StackPanel Orientation="Horizontal" Grid.Row="0" > <HyperlinkButton Name="hyperlinkbutton_导入ExcelXML文件" Content="导入ExcelXML文件" Style="{StaticResource hyperlinkbutton_style}" Click="hyperlinkbutton_导入ExcelXML文件_Click" ></HyperlinkButton> <HyperlinkButton Content="导出ExcelXML文件" Style="{StaticResource hyperlinkbutton_style}"></HyperlinkButton> <StackPanel Name="stackpanel_工作表选择" Visibility="Collapsed" Orientation="Horizontal" Margin="10 0" > <TextBlock Name="textblock_工作表" Text="工作表:" Foreground="Blue" VerticalAlignment="Center" ></TextBlock> <ComboBox Name="comboBox_工作表选择" Width="25" HorizontalAlignment="Left" SelectionChanged="comboBox_工作表选择_SelectionChanged" ></ComboBox> </StackPanel> </StackPanel> <sdk:DataGrid Name="datagrid_显示" Grid.Row="1" MouseMove="datagrid_显示_MouseMove" ></sdk:DataGrid> <TextBlock Name="textblock_status" Text="" Foreground="Blue" Grid.Row="2"></TextBlock> </Grid> </navigation:Page>
// 3 实现代码
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Navigation; using System.IO; using System.Xml.Linq; using System.Collections; using System.Windows.Data; using SLApplicationMadaming.Views.第2部分调试.MSOfficeExcel导入导出; namespace SLApplicationMadaming.Views.第2部分调试 { public partial class Page_MSOfficeExcel导入导出 : Page { #region "自定义" private madamingExcelXMLWorkSheetImport excel_xml_worksheet_import; #endregion public Page_MSOfficeExcel导入导出() { InitializeComponent(); } // 当用户导航到此页面时执行。 protected override void OnNavigatedTo(NavigationEventArgs e) { } private void HyperlinkButton_Click(object sender,RoutedEventArgs e) { } private void hyperlinkbutton_导入ExcelXML文件_Click(object sender,RoutedEventArgs e) { try { OpenFileDialog ofld = new OpenFileDialog(); if (ofld.ShowDialog() == true) { string name = ofld.File.Name; Stream stream = ofld.File.OpenRead(); stackpanel_工作表选择.Visibility = Visibility.Collapsed ; excel_xml_worksheet_import = new madamingExcelXMLWorkSheetImport(stream); stackpanel_工作表选择.Visibility = Visibility.Visible; comboBox_工作表选择.Items.Clear(); for (int i = 0; i < excel_xml_worksheet_import.WorkSheets.Count(); i++) { ComboBoxItem c = new ComboBoxItem(); c.Content = excel_xml_worksheet_import.WorkSheets[i].WorksheetName; comboBox_工作表选择.Items.Add(c); } if (comboBox_工作表选择.Items.Count() > 0) comboBox_工作表选择.Selectedindex = 0; } } catch (Exception ex) { MessageBox.Show(ex.Message,"打开文件提示",MessageBoxButton.OK); } } private void datagrid_显示_MouseMove(object sender,MouseEventArgs e) { textblock_status.Text =string.Format ("{0}",datagrid_显示.Columns.Count()); } private void comboBox_worksheet_SelectionChanged(object sender,SelectionChangedEventArgs e) { } private void comboBox_工作表选择_SelectionChanged(object sender,SelectionChangedEventArgs e) { int i = comboBox_工作表选择.Selectedindex; ComboBoxItem ci=(ComboBoxItem)comboBox_工作表选择.SelectedItem ; textblock_工作表.Text = string.Format("工作表:{0}",ci.Content); //excel_xml_worksheet_import.GeerateDataGridHeaders(datagrid_显示,i); excel_xml_worksheet_import.GenerateDataGridData(datagrid_显示,i); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。