Чтение и запись строки на иврите в C # на VS - PullRequest
0 голосов
/ 23 февраля 2019

Я создаю приложение Windows C #.И мне нужно прочитать текст на иврите из документа Excel, а затем кое-что сделать, а затем записать текст на иврите в документ Word.В настоящее время мне не удалось прочитать иврит из Excel (при печати на консоль я получил вопросительные знаки).Я знаю, что эта проблема связана с проблемами кодирования.

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace MLDRApplication
{
    public class ExcelReader
    {
        public static List<Customer> ExcelReadergetCustomers(string path)
        {
            List<Customer> customersList = new List<Customer>();
            //Create COM Objects. Create a COM object for everything that is referenced
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(@"C:\Users\fares\OneDrive\Documents\customersInitValues.xlsx");
            Excel.Worksheet customersWorksheet = excelWorkbook.Sheets[1];
            Excel.Worksheet laundryUnitsWorksheet = excelWorkbook.Sheets[2];


            Excel.Range customersRange = customersWorksheet.UsedRange;
            Excel.Range laundryUnitsRange = laundryUnitsWorksheet.UsedRange;

            int customersSheetRowCount = customersRange.Rows.Count;
            int customersSheetColCount = customersRange.Columns.Count;
            int laundryUnitsSheetRowCount = laundryUnitsRange.Rows.Count;
            int laundryUnitsSheetColCount = laundryUnitsRange.Columns.Count;



            //iterate over the rows and columns and print to the console as it appears in the file
            //excel is not zero based!!
            for (int i = 1; i <= customersSheetRowCount; i++)
            {
                for (int j = 1; j <= customersSheetColCount; j++)
                {
                    //new line
                    if (j == 1)
                        Console.Write("\r\n");

                    //write the value to the console
                    //Console.OutputEncoding = System.Text.Encoding.GetEncoding("Windows-1255");
                    if (customersRange.Cells[i, j] != null && customersRange.Cells[i, j].Value2 != null)
                    {
                        //customersList.Add()
                        Console.Write(customersRange.Cells[i, j].Value2.ToString() + "\t");
                    }
                }

            }

            for (int i = 1; i <= laundryUnitsSheetRowCount; ++i)
            {
                for (int j = 1; j <= laundryUnitsSheetColCount; ++j)
                {
                    //new line
                    if (j == 1)
                        Console.Write("\r\n");

                    //write the value to the console
                    //Console.OutputEncoding = System.Text.Encoding.GetEncoding("Windows-1255");
                    if (laundryUnitsRange.Cells[i, j] != null && laundryUnitsRange.Cells[i, j].Value2 != null)
                    {
                        //customersList.Add()
                        Console.Write(laundryUnitsRange.Cells[i, j].Value2.ToString() + "\t");
                    }
                }

            }

            //cleanup
            GC.Collect();
            GC.WaitForPendingFinalizers();

            //rule of thumb for releasing com objects:
            //  never use two dots, all COM objects must be referenced and released individually
            //  ex: [somthing].[something].[something] is bad

            //release com objects to fully kill excel process from running in the background
            Marshal.ReleaseComObject(customersRange);
            Marshal.ReleaseComObject(customersWorksheet);
            Marshal.ReleaseComObject(laundryUnitsRange);
            Marshal.ReleaseComObject(laundryUnitsWorksheet);


            //close and release
            excelWorkbook.Close();
            Marshal.ReleaseComObject(excelWorkbook);

            //quit and release
            excelApp.Quit();
            Marshal.ReleaseComObject(excelApp);

            return customersList;



        }
    }
}

Я прочитал эту сессию здесь , но не понял и нашел правильное решение дляЭта проблема.

1 Ответ

0 голосов
/ 23 февраля 2019

Ваша проблема не в чтении.
Это потому, что кодировка консольного приложения по умолчанию не поддерживает иврит.

В Консольном приложении вы можете изменить кодировку, добавив следующую строку в начале вашего кода:

Console.OutputEncoding = Encoding.GetEncoding("Windows-1255");

Редактировать: очевидно

Вы не можете печатать символы Unicode в консоли, она поддерживает только те символы, которые доступны на текущей кодовой странице.Символы, которые недоступны, преобразуются в ближайший эквивалент или знак вопроса.

, чтобы вы могли выполнить небольшой "взлом" и просто изменить поток вывода defualt в файл:

   Console.SetOut(new StreamWriter(File.Create("d:/your_output.txt"), Encoding.UTF8) { AutoFlush=true});

и к концу прогона он все туда запишет.

это "быстрое и грязное" решение для постоянного решения, рассмотрите возможность использования библиотеки журналирования какlog4net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...