微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight 导入Excel XML 文件

//  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] 举报,一经查实,本站将立刻删除。

相关推荐