Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Общие вопросы > Проход по строкам таблицы с объединенными ячейками


Автор: tumanovalex 23.04.18, 18:32
Программа
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    using System;
    using System.Configuration;
    using Word = Microsoft.Office.Interop.Word;
    using System.Collections.Generic;
    using System.IO;
    using System.Configuration;
     
    namespace CsWordCons
    {
      class Program
      {
     
        static void GetFindString(int numRowBegin, int numCol)
        {
          string cyrDir = Environment.CurrentDirectory;
          string[] strDocFileName = Directory.GetFiles(cyrDir, "*.do*", SearchOption.AllDirectories);
          if (strDocFileName.Length > 1)
          {
            Console.WriteLine("Рядом с программой должен быть один файл с расширением doc или docx!");
            Console.ReadKey();
            Environment.Exit(1);
          }
          Object missing = System.Reflection.Missing.Value;
          Object confConv = false;
          Object readOnly = true;
          Object isVisible = false;
          Object saveChanges = false;
          Object filename = strDocFileName[0];
          Word.Application word = new Word.Application();
          Word.Document doc = new Word.Document();
          doc = word.Documents.Open(ref filename, ref confConv, ref readOnly);
          word.Visible = false;
          Word.Table tbl = null;
          try
          {
            tbl = doc.Tables[1];
          }
          catch (Exception ex)
          {
            Console.WriteLine("В документе " + strDocFileName[0] + " нет таблиц!");
            ((Word._Document)doc).Close(ref saveChanges, missing, missing);
            ((Word._Application)word).Quit(ref saveChanges);
            Console.ReadKey();
            Environment.Exit(1);
          }
          int numRows = tbl.Rows.Count;
          List<string> strListFind = new List<string>();
          for (int i = numRowBegin; i <= numRows; i++)
          {
            string[] strOnlyFind = tbl.Cell(i, numCol).Range.Text.Split('\r');
            foreach (string str in strOnlyFind)
            {
              if (str.Length > 2)
                strListFind.Add(str.Trim());
            }
          }
          Console.WriteLine("Будет проведен поиск следующих серийных номеров:");
          foreach (string str in strListFind)
            Console.WriteLine(str);
          Console.WriteLine("---------------------------------------------");
          Console.WriteLine("Нажмите любую клавишу для поиска.\nЕсли серийные номера определены неправильно - проверьте\n" +
                             "данные в конфигурационном файле");
          Console.ReadKey();
          ((Word._Document)doc).Close(ref saveChanges, missing, missing);
          ((Word._Application)word).Quit(ref saveChanges);
        } // GetFindString
     
        static void Main(string[] args)
        {
          Configuration config = ConfigurationManager.OpenExeConfiguration("CsWordCons.exe");
          string[] allKeys = config.AppSettings.Settings.AllKeys;
          int numKeys = allKeys.Length;
          string strNumRowBegin = config.AppSettings.Settings[allKeys[0]].Value;
          string strNumCol = config.AppSettings.Settings[allKeys[1]].Value;
          string strResultFileName = config.AppSettings.Settings[allKeys[numKeys - 1]].Value;
          GetFindString(int.Parse(strNumRowBegin), int.Parse(strNumCol));
          Console.ReadKey();
        } // Main
      } //class Program
    } // namespace CsWordCons
нормально работает, если в таблице нет строк с объединенными ячейками. Если они есть, то в строке string[] strOnlyFind = tbl.Cell(i, numCol).Range.Text.Split('\r'); - ошибка.
Подскажите, пожалуйста, как:
- перемещаться по строкам таблицы;
- определить, что в строке объединены ячейки. Проект прикрепил.
CsWordTest.zip (, : 111)

Автор: MIF 24.04.18, 03:57
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    string[] strOnlyFind = new string[0];
    try
    {
        strOnlyFind = tbl.Cell(i, numCol).Range.Text.Split('\r');
     
    }
    catch (System.Runtime.InteropServices.COMException cex)
    {
        if(-2146822347 == cex.ErrorCode)
        {
            continue;
        }
        throw;
    }

Автор: tumanovalex 25.04.18, 17:38
А нельзя перемещаться по строкам и определять количество ячеек в строке? Чтобы не создавать исключения. Если можно, то как это сделать?

Автор: MIF 26.04.18, 06:01
Не знаю.

Автор: tumanovalex 26.04.18, 10:10
Спасибо за код. Буду использовать исключения.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)