• sl3中的DataGrid中的数据导出到Excel中 使用csv格式 解决中文是乱码的问题


    首先建立一个简单的类作为数据源
       public class Book
        {
            
    public int ID { getset; }
            
    public string BookName { getset; }
            
    public string BookAuthor { getset; }
        }

    Page.xaml界面设计,Page.xaml代码如下:

    <UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SlExportExcelCsv.MainPage"
        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" 
       
    >
      
    <Grid x:Name="LayoutRoot" Loaded="LayoutRoot_Loaded">
            
    <Grid>
                
    <Grid.RowDefinitions>
                    
    <RowDefinition></RowDefinition>
                    
    <RowDefinition></RowDefinition>
                
    </Grid.RowDefinitions>
           
                
    <data:DataGrid x:Name="dg"></data:DataGrid>
                
    <Button x:Name = "btnExport" Content="导出到Excel" Grid.Row="1" Height="32"  Width="100"  FontSize="13" Margin="100,15,0,0" HorizontalAlignment="Left" VerticalAlignment="Bottom" Visibility="Visible" />
            
    </Grid>
        
    </Grid>
    </UserControl>

    LayoutRoot_Loaded事件代码如下:

       private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
            {
                List
    <Book> list = new List<Book>();
                
    for (int i = 0; i < 4; i++)
                {
                    Book book 
    = new Book();
                    book.ID 
    = i;
                    book.BookName 
    = "程序员杂志" + i.ToString();
                    book.BookAuthor 
    = "主编  黄长著" + i.ToString();
                    list.Add(book);
                }
                
    this.dg.ItemsSource = list;

    导出事件代码如下 :

     void btnExport_Click(object sender, RoutedEventArgs e)
            {
                ExportExcel.ExportDataGridSaveAs(
    true,this.dg);
                
    //throw new NotImplementedException();
                
    //string data = ExportExcel.ExportDataGrid(true, this.dg);
                
    //SaveFileDialog sfd = new SaveFileDialog();
                
    //sfd.DefaultExt = "csv";
                
    //sfd.Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*";

                
    //sfd.FilterIndex = 1;

                
    //if (sfd.ShowDialog() == true)
                
    //{
                
    //    using (Stream stream = sfd.OpenFile())
                
    //    {
                
    //        using (StreamWriter sw = new StreamWriter(stream, System.Text.UnicodeEncoding.Unicode))
                
    //        {
                
    //            data = data.Replace(",", "\t");
                
    //            sw.Write(data);
                
    //            sw.Close();
                
    //        }
                
    //        stream.Close();
                
    //    }
                
    //}

    导出类文件如下:

      public static class ExportExcel
        {
            
    #region 导出DataGrid数据到Excel

            
    /// <summary>
            
    /// CSV格式化
            
    /// </summary>
            
    /// <param name="data">数据</param>
            
    /// <returns>格式化数据</returns>
            private static string FormatCSVField(string data)
            {
                
    return String.Format("\"{0}\"", data.Replace("\"""\"\"\"").Replace("\n""").Replace("\r"""));
            }

            
    /// <summary>
            
    /// 导出DataGrid数据到Excel
            
    /// </summary>
            
    /// <param name="withHeaders">是否需要表头</param>
            
    /// <param name="grid">DataGrid</param>
            
    /// <returns>Excel内容字符串</returns>
            public static string ExportDataGrid(bool withHeaders, DataGrid grid)
            {
                
    string colPath; System.Reflection.PropertyInfo propInfo;
                System.Windows.Data.Binding binding;
                System.Text.StringBuilder strBuilder 
    = new System.Text.StringBuilder();
                System.Collections.IList source 
    = (grid.ItemsSource as System.Collections.IList);
                
    if (source == nullreturn "";
                List
    <string> headers = new List<string>();
                grid.Columns.ToList().ForEach(col 
    =>
                {
                    
    if (col is DataGridBoundColumn)
                    { headers.Add(FormatCSVField(col.Header.ToString())); }
                });
                strBuilder.Append(String.Join(
    ",", headers.ToArray())).Append("\r\n");
                
    foreach (Object data in source)
                {
                    List
    <string> csvRow = new List<string>();
                    
    foreach (DataGridColumn col in grid.Columns)
                    {
                        
    if (col is DataGridBoundColumn)
                        {
                            binding 
    = (col as DataGridBoundColumn).Binding;
                            colPath 
    = binding.Path.Path;
                            propInfo 
    = data.GetType().GetProperty(colPath);
                            
    if (propInfo != null)
                            {
                                csvRow.Add(FormatCSVField(propInfo.GetValue(data, 
    null).ToString()));
                            }
                        }
                    }
                    strBuilder.Append(String.Join(
    ",", csvRow.ToArray())).Append("\r\n");
                }
                
    return strBuilder.ToString();
            }
            
    /// <summary>
            
    /// 导出DataGrid数据到Excel
            
    /// </summary>
            
    /// <param name="withHeaders">是否需要表头</param>
            
    /// <param name="grid">DataGrid</param>
            
    /// <returns>Excel内容字符串</returns>
            public static string ExportDataGrid(bool withHeaders, DataGrid grid, bool dataBind)
            {
                
    string colPath;
                System.Reflection.PropertyInfo propInfo;
                System.Windows.Data.Binding binding;
                System.Text.StringBuilder strBuilder 
    = new System.Text.StringBuilder();
                System.Collections.IList source 
    = (grid.ItemsSource as System.Collections.IList);
                
    if (source == nullreturn "";
                List
    <string> headers = new List<string>();
                grid.Columns.ToList().ForEach(col 
    =>
                {
                    
    if (col is DataGridTemplateColumn)
                    {
                        
    if (col.Header != null)
                        {
                            headers.Add(FormatCSVField(col.Header.ToString()));
                        }
                        
    else
                        {
                            headers.Add(
    string.Empty);
                        }
                    }
                });
                strBuilder.Append(String.Join(
    ",", headers.ToArray())).Append("\r\n");
                
    foreach (Object data in source)
                {
                    List
    <string> csvRow = new List<string>();
                    
    foreach (DataGridColumn col in grid.Columns)
                    {
                        
    if (col is DataGridTemplateColumn)
                        {
                            FrameworkElement cellContent 
    = col.GetCellContent(data);
                            TextBlock block 
    = null;
                            
    if (cellContent.GetType() == typeof(Grid))
                            {
                                block 
    = cellContent.FindName("TempTextblock"as TextBlock;
                            }
                            
    else
                            {
                                block 
    = cellContent as TextBlock;
                            }
                            
    if (block != null)
                            {
                                csvRow.Add(FormatCSVField(block.Text));
                            }
                        }
                    }
                    strBuilder.Append(String.Join(
    ",", csvRow.ToArray())).Append("\r\n");
                    
    //strBuilder.Append(String.Join(",", csvRow.ToArray())).Append("\t");
                }
                
    return strBuilder.ToString();
            }
            
    /// <summary>
            
    /// 导出DataGrid数据到Excel为CVS文件
            
    /// 使用utf8编码 中文是乱码  改用Unicode编码
            
    /// 
            
    /// </summary>
            
    /// <param name="withHeaders">是否带列头</param>
            
    /// <param name="grid">DataGrid</param>
            public static void ExportDataGridSaveAs(bool withHeaders, DataGrid grid)
            {
                
    string data =ExportDataGrid(true, grid);
                SaveFileDialog sfd 
    = new SaveFileDialog()
                {
                    DefaultExt 
    = "csv",
                    Filter 
    = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*",
                    FilterIndex 
    = 1
                };
                
    if (sfd.ShowDialog() == true)
                {
                    
    using (Stream stream = sfd.OpenFile())
                    {
                        
    using (StreamWriter writer = new StreamWriter(stream, System.Text.UnicodeEncoding.Unicode))
                        {
                            data 
    = data.Replace(",""\t");
                            writer.Write(data);
                            writer.Close();
                        }
                        stream.Close();
                    }
                }
            }

            
    #endregion 导出DataGrid数据到Excel

    源程序下载地址:https://files.cnblogs.com/z_lb/SlExportExcelCsv.zip
  • 相关阅读:
    Android 布局中 如何使控件居中
    VGA, QVGA, HVGA, WVGA, FWVGA和iPhone显示分辨率
    [转+整理] Android 分辨率,密度,像素单位说明
    多线程的知识点总结
    集合的相关信息
    spring cloud详解
    iostat实时监控磁盘util
    Jenkins安装过程
    hdfs的block为什么设置成128M
    shell变量自增的几种方式
  • 原文地址:https://www.cnblogs.com/z_lb/p/1583369.html
Copyright © 2020-2023  润新知