Я хочу экспортировать строки таблицы данных в файл Excel.Некоторая информация на английском языке, а некоторые на Perisan.Я много искал и проверял два разных способа.Первый способ использует ApplicationCommands.Copy.Execute для копирования данных.Проблема в том, что символы на персидском языке изменяются на ???(вопросительный знак), даже если я использую кодировку utf-8 или любую другую кодировку.Я также использовал Microsoft.Office.Interop.Excel.Application для копирования строк.Проблема с этим способом состоит в том, что копируются только 7 верхних строк, но проблема кодирования решается таким образом.Первый способ (https://www.codeproject.com/Questions/354557/WPF-DataGrid-to-Excel) такой, как показано ниже:
DgReport.SelectAllCells();
DgReport.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
ApplicationCommands.Copy.Execute(null, DgReport);
String resultat = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
String result = (string)Clipboard.GetData(DataFormats.Text);
DgReport.UnselectAllCells();
System.IO.StreamWriter file1 = new System.IO.StreamWriter(@"C:\Users\test.csv", false, Encoding.UTF8);
file1.WriteLine(result.Replace(',', ' '));
file1.Close();
Второй способ (https://www.codeproject.com/Questions/678267/Data-Export-from-DataGrid-to-Excel-is-not-working) такой же, как и ниже. Таким образом, просто скопируйте 7 верхних строк, но без проблем с кодированием.
int i1 = 0;
int k1 = 1, h = 1;
string strFullFilePathNoExt = @"C:\Users\TestExcel4.xls";
var rows = GetDataGridRows(DgReport);
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook ExcelBook;
Microsoft.Office.Interop.Excel._Worksheet ExcelSheet;
ExcelBook = (Microsoft.Office.Interop.Excel._Workbook)ExcelApp.Workbooks.Add(1);
ExcelSheet = (Microsoft.Office.Interop.Excel._Worksheet)ExcelBook.ActiveSheet;
for (i1 = 1; i1 <= DgReport.Columns.Count; i1++)
{
ExcelSheet.Cells[1, i1] = DgReport.Columns[i1 - 1].Header.ToString();
}
foreach (DataGridRow r in rows)
{
DataRowView rv = (DataRowView)r.Item;
foreach (DataGridColumn column in DgReport.Columns)
{
if (column.GetCellContent(r) is TextBlock)
{
TextBlock cellContent = column.GetCellContent(r) as TextBlock;
ExcelSheet.Cells[h + 1, k1] = cellContent.Text.Trim();
k1++;
}
}
k1 = 1;
h++;
}
ExcelApp.Visible = false;
ExcelBook.SaveAs(strFullFilePathNoExt, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true,
Missing.Value, Missing.Value, Missing.Value);
ExcelBook.Close(strFullFilePathNoExt, Missing.Value, Missing.Value);
ExcelSheet = null;
ExcelBook = null;
ExcelApp = null;
}
public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
var itemsSource = grid.ItemsSource as IEnumerable;
if (null == itemsSource) yield return null;
foreach (var item in itemsSource)
{
var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row) yield return row;
}
}
Способ определения сетки данных описан ниже:
<DataGrid Name="DgReport" IsReadOnly="True" HeadersVisibility="Column" ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Visible" AutoGenerateColumns="False" SelectionChanged="DgReport_SelectionChanged" FlowDirection="RightToLeft" ></DataGrid>
Способ заполнения таблицы данных заключается в том, что я отправляю данные из базы данных в таблицу данных с именем Reportdt, а затем
DgReport.DataContext = Reportdt;
DataGridTextColumn c3 = new DataGridTextColumn();
Binding b3 = new Binding("FromNumber");
c3.Binding = b3;
c3.CanUserResize = false;
DgReport.Columns.Add(c3);
Есть идеи?