locked
这样的“DataGrid”应该怎样导出??? RRS feed

  • 问题

  • 这样的“DataGrid”应该怎样导出???       将DataGrid中绑定数据导出为“Excel”和“Pdf”应该怎样做???

    DataGrid定义如下:       

    <sdk:DataGrid Grid.Row="1" Name="dg_EnergyCustom" AutoGenerateColumns="False" >
                                                <sdk:DataGrid.Columns>
                                                    <sdk:DataGridTemplateColumn     DisplayIndex="-1"   Header="年份" IsReadOnly="True" Width="30*" >
                                                        <sdk:DataGridTemplateColumn.CellTemplate >
                                                            <DataTemplate>
                                                                <TextBlock FontSize="13" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding EnergyYear}"></TextBlock>
                                                            </DataTemplate>
                                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                                    </sdk:DataGridTemplateColumn>
                                                    <sdk:DataGridTemplateColumn Header="项目" Width="30*">
                                                        <sdk:DataGridTemplateColumn.CellTemplate >
                                                            <DataTemplate>
                                                                <Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                                                                    <Grid.RowDefinitions>
                                                                        <RowDefinition Height="20" />
                                                                        <RowDefinition Height="20"/>
                                                                        <RowDefinition Height="20"/>
                                                                    </Grid.RowDefinitions>
                                                                    <TextBlock Text="能耗量合计" Grid.Row="0"   ></TextBlock>
                                                                    <TextBlock Text="单位面积能耗" Grid.Row="1"></TextBlock>
                                                                    <TextBlock Text="生均能耗" Grid.Row="2"></TextBlock>
                                                                </Grid>

                                                            </DataTemplate>
                                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                                    </sdk:DataGridTemplateColumn>
    <sdk:DataGridTemplateColumn Header="全校" Width="40*">
                                                        <sdk:DataGridTemplateColumn.CellTemplate >
                                                            <DataTemplate>
                                                                <Grid ShowGridLines="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                                                    <Grid.RowDefinitions>
                                                                        <RowDefinition Height="20" />
                                                                        <RowDefinition Height="20"/>
                                                                        <RowDefinition Height="20"/>
                                                                    </Grid.RowDefinitions>
                                                                    <TextBlock  Grid.Row="0"  Text="{Binding EnergySum}"  ></TextBlock>
                                                                    <TextBlock  Grid.Row="1" Text="{Binding EnergyUnitArea}" ></TextBlock>
                                                                    <TextBlock  Grid.Row="2" Text="{Binding EnergyEveryOne}"></TextBlock>
                                                                </Grid>

                                                            </DataTemplate>
                                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                                    </sdk:DataGridTemplateColumn>
                                                </sdk:DataGrid.Columns>

                                            </sdk:DataGrid>

    问题:

           “DataGrid”中使用了“DataGridTemplateColumn”、“CellTemplate”和“DataTemplate”,并在它们中定义了“Grid”、“TextBlock”等元素。在这种情况下,“DataGrid”导出的数据和它展示的数据格式一致吗???         导出方法应该如何写???

                                                   

    Science and technology is my lover.

    2012年7月25日 11:21

答案

  • 你好,

    你可以通过类似于以下的代码实现:

    foreach (object data in dGrid.ItemsSource)
            {
                lstFields.Clear();
                foreach (DataGridColumn col in dGrid.Columns)
                {
                    string strValue = "";                    
                    Binding objBinding = null;
                    if (col is DataGridBoundColumn)
                        objBinding = (col as DataGridBoundColumn).Binding;
                    if (col is DataGridTemplateColumn)
                    {
                        //This is a template column...
                        //    let us see the underlying dependency object
                        DependencyObject objDO = 
                          (col as DataGridTemplateColumn).CellTemplate.LoadContent();
                        FrameworkElement oFE = (FrameworkElement)objDO;
                        FieldInfo oFI = oFE.GetType().GetField("TextProperty");
                        if (oFI != null)
                        {
                            if (oFI.GetValue(null) != null)
                            {
                                if (oFE.GetBindingExpression(
                                       (DependencyProperty)oFI.GetValue(null)) != null)
                                    objBinding = 
                                      oFE.GetBindingExpression(
                                      (DependencyProperty)oFI.GetValue(null)).ParentBinding;
                            }
                        }
                    }
                    if (objBinding != null)
                    {
                        if (objBinding.Path.Path != "")
                        {
                            PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path);
                            if (pi != null) strValue = pi.GetValue(data, null).ToString();
                        }
                        if (objBinding.Converter != null)
                        {
                            if (strValue != "")
                                strValue = objBinding.Converter.Convert(strValue, 
                                  typeof(string), objBinding.ConverterParameter, 
                                  objBinding.ConverterCulture).ToString();
                            else
                                strValue = objBinding.Converter.Convert(data, 
                                  typeof(string), objBinding.ConverterParameter, 
                                  objBinding.ConverterCulture).ToString();
                        }
                    }
                    lstFields.Add(FormatField(strValue,strFormat));
                }
                BuildStringOfRow(strBuilder, lstFields, strFormat);
            }
    

    最后将数据转换成XML格式。详细信息请参考:

    http://www.codeproject.com/Articles/45731/Export-Silverlight-DataGrid-to-Excel-XML-CSV

    • 已标记为答案 Haixia_Xie 2012年8月2日 2:37
    • 取消答案标记 starrycheng 2012年8月3日 6:26
    • 已建议为答案 Haixia_Xie 2012年8月6日 10:47
    • 已标记为答案 Haixia_Xie 2012年8月7日 7:28
    2012年7月27日 7:57
  • 据我所知,Silverlight本身不支持中文编码,可以通过自定义一个编码以支持中文(继承自System.Text.Encoding)。

    参考:http://msdn.microsoft.com/en-us/library/system.text.encoding(v=VS.95).aspx

    http://www.hugwp.com/article-529-1.html

    • 已建议为答案 Haixia_Xie 2012年8月6日 10:47
    • 已标记为答案 Haixia_Xie 2012年8月7日 7:28
    2012年8月3日 7:21

全部回复

  • 你好,

    你可以通过类似于以下的代码实现:

    foreach (object data in dGrid.ItemsSource)
            {
                lstFields.Clear();
                foreach (DataGridColumn col in dGrid.Columns)
                {
                    string strValue = "";                    
                    Binding objBinding = null;
                    if (col is DataGridBoundColumn)
                        objBinding = (col as DataGridBoundColumn).Binding;
                    if (col is DataGridTemplateColumn)
                    {
                        //This is a template column...
                        //    let us see the underlying dependency object
                        DependencyObject objDO = 
                          (col as DataGridTemplateColumn).CellTemplate.LoadContent();
                        FrameworkElement oFE = (FrameworkElement)objDO;
                        FieldInfo oFI = oFE.GetType().GetField("TextProperty");
                        if (oFI != null)
                        {
                            if (oFI.GetValue(null) != null)
                            {
                                if (oFE.GetBindingExpression(
                                       (DependencyProperty)oFI.GetValue(null)) != null)
                                    objBinding = 
                                      oFE.GetBindingExpression(
                                      (DependencyProperty)oFI.GetValue(null)).ParentBinding;
                            }
                        }
                    }
                    if (objBinding != null)
                    {
                        if (objBinding.Path.Path != "")
                        {
                            PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path);
                            if (pi != null) strValue = pi.GetValue(data, null).ToString();
                        }
                        if (objBinding.Converter != null)
                        {
                            if (strValue != "")
                                strValue = objBinding.Converter.Convert(strValue, 
                                  typeof(string), objBinding.ConverterParameter, 
                                  objBinding.ConverterCulture).ToString();
                            else
                                strValue = objBinding.Converter.Convert(data, 
                                  typeof(string), objBinding.ConverterParameter, 
                                  objBinding.ConverterCulture).ToString();
                        }
                    }
                    lstFields.Add(FormatField(strValue,strFormat));
                }
                BuildStringOfRow(strBuilder, lstFields, strFormat);
            }
    

    最后将数据转换成XML格式。详细信息请参考:

    http://www.codeproject.com/Articles/45731/Export-Silverlight-DataGrid-to-Excel-XML-CSV

    • 已标记为答案 Haixia_Xie 2012年8月2日 2:37
    • 取消答案标记 starrycheng 2012年8月3日 6:26
    • 已建议为答案 Haixia_Xie 2012年8月6日 10:47
    • 已标记为答案 Haixia_Xie 2012年8月7日 7:28
    2012年7月27日 7:57
  • 大师,这个方法是很好:http://www.codeproject.com/Articles/45731/Export-Silverlight-DataGrid-to-Excel-XML-CSV?msg=4328649#xx4328649xx

    但是问题是“汉字”会出现乱码啊。

    乱码如下:


    Science and technology is my lover.

    2012年8月3日 6:28
  • 据我所知,Silverlight本身不支持中文编码,可以通过自定义一个编码以支持中文(继承自System.Text.Encoding)。

    参考:http://msdn.microsoft.com/en-us/library/system.text.encoding(v=VS.95).aspx

    http://www.hugwp.com/article-529-1.html

    • 已建议为答案 Haixia_Xie 2012年8月6日 10:47
    • 已标记为答案 Haixia_Xie 2012年8月7日 7:28
    2012年8月3日 7:21