Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/17: Рейтинг темы: голосов - 17, средняя оценка - 4.71
MZ2
2 / 2 / 1
Регистрация: 30.11.2010
Сообщений: 52
1

Работа с документами Excel без Microsoft.Office.Interop.Excel

28.11.2014, 18:21. Просмотров 3420. Ответов 11
Метки нет (Все метки)

всем добрый день
все дело в том что для своих программ я использую БД Excel
но! однако не все устанавливают на компьютере Office, да и не правильно от пользователей требовать что бы они устанавливали его.... . в общем отсюда же проблема с Microsoft.Office.Interop.Excel
мне нужно с проекта убрать(заменить) Microsoft.Office.Interop так что бы все не зависимо от того что у них установлен office или нет могли пользоваться программой!
может кто-то знает как можно обойтись без Microsoft.Office.Interop.. и спокойно работать с excel?
буду очень признателен!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2014, 18:21
Ответы с готовыми решениями:

Некорректная работа с Microsoft.office.interop.excel.dll на других ПК
Всем добра! Понимаю, тема уже избита и много раз обсуждалась, но все же...

Microsoft.Office.Interop.Excel
Доброго времени суток! Делаю гистограмму, есть код: var XL1 = new...

Как подключить microsoft.office.interop.excel
Добрый день. У меня такой вопрос: Во время написания курсовой работы по...

Где взять справочник функций сборки Microsoft.Office.Interop.Excel?
Имеется код, где используется сборка Microsoft.Office.Interop.Excel using...

Не могу найти в менеджере ссылок сборку "Microsoft.Office.Interop.Excel"
Пытаюсь подключить сборку "Microsoft.Office.Interop.Excel" Подключил COM...

11
Metall_Version
2119 / 1256 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
28.11.2014, 19:02 2
Цитата Сообщение от MZ2 Посмотреть сообщение
да и не правильно от пользователей требовать что бы они устанавливали его.... . в общем отсюда же проблема с Microsoft.Office.Interop.Excel
а где логика, если у юзера не установлен ексель, то зачем в программе создавать или читать ексель документы?

вот http://www.codeproject.com/Articles/...icrosoft-Excel

Добавлено через 36 секунд
(и еще http://stackoverflow.com/questions/2...without-office
0
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
19.01.2015, 15:28 3
Интересует та же проблема!
Понравился первый способ с codeproject, однако почему то он с нуля перезаписывает уже готовый файл.
Делаю так:
C#
1
2
3
4
5
6
7
8
 FileStream stream = new FileStream("test.xls", FileMode.Open);
            ExcelWriter writer = new ExcelWriter(stream);
            writer.BeginWrite();
            //
            writer.WriteCell(3, 3, "ZerGOOD");
            //
            writer.EndWrite();
            stream.Close();
Поле записывается, но остальные поля стираются!
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2015, 15:31 4
Считай файл, замени ячейку, запиши обратно
0
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
19.01.2015, 15:36 5
Psilon, очень смешно)
Ничего не понял.... Файл я и так считал в поток. А ридера у данной штуки не предусмотрено. Если вы об этом.
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2015, 16:17 6
jenokizm, а я и не смеюсь.

Если авторы не предусмотрели перезапись по одной ячейке, то им (и вам) можно только посочувствовать.

То есть вам нужно делать ReadCell всех ячеек видимо, после этого заменять одну из них, и затем обратно делать WriteCell. Печально, но вариантов маловато, честно говоря. Ну или написать свою библиотеку по работе с xls.

Самый адекватный вариант - использовать формат 2007 экселя - xlsx, тогда с помощью OpenXML всё это можно легко провернуть. Но с xls он работать не будет.
0
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
19.01.2015, 16:33 7
Цитата Сообщение от Psilon Посмотреть сообщение
использовать формат 2007 экселя - xlsx
ого. а я думал это 2013 екселя формат... Веб версия мой xls автоматом перегнала в xlsx без спроса(
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2015, 16:35 8
jenokizm, это формат 2007 и более новых (2010,2013,2016,...). 2003 не поддерживается. Если устраивает - то добавляйте в проект nuget-пакет openXML, через него всё легко делается.

Добавлено через 59 секунд
пакет DocumentFormat.OpenXML
2
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2015, 17:06 9
Вот вам пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.IO;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
 
namespace OpenExcelTest
{
    internal class Program
    {
        private static void Main()
        {
            const string source = "file.xlsx";
            const string filename = "result.xlsx";
            File.Copy(source, filename, true);
            using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filename, true))
            {
                WorkbookPart workbookPart = doc.WorkbookPart;
 
                WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                Worksheet sheet = worksheetPart.Worksheet;
 
                var cells = sheet.Descendants<Cell>().ToList();
                var rows = sheet.Descendants<Row>().ToList();
 
                Console.WriteLine(cells.LongCount());
                Console.WriteLine(rows.LongCount());
 
                foreach (Cell cell in cells)
                {
                    if (cell.CellValue != null)
                    {
                        Console.WriteLine("Cell contents: {0}", cell.CellValue.Text);
                    }
                }
 
                Cell newCell = InsertCellInWorksheet("A", 5, worksheetPart);
                newCell.CellValue = new CellValue("100500");
 
                sheet.Save();
            }
        }
 
        private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart)
        {
            Worksheet worksheet = worksheetPart.Worksheet;
            var sheetData = worksheet.GetFirstChild<SheetData>();
            string cellReference = columnName + rowIndex;
 
            // If the worksheet does not contain a row with the specified row index, insert one.
            Row row;
            if (sheetData.Elements<Row>().Count(r => r.RowIndex == rowIndex) != 0)
            {
                row = sheetData.Elements<Row>().First(r => r.RowIndex == rowIndex);
            }
            else
            {
                row = new Row {RowIndex = rowIndex};
                sheetData.Append(row);
            }
 
            // If there is not a cell with the specified column name, insert one.  
            if (row.Elements<Cell>().Any(c => c.CellReference.Value == columnName + rowIndex))
            {
                return row.Elements<Cell>().First(c => c.CellReference.Value == cellReference);
            }
            // Cells must be in sequential order according to CellReference. Determine where to insert the new cell.
            Cell refCell =
                row.Elements<Cell>()
                   .FirstOrDefault(
                                   cell =>
                                   String.Compare(cell.CellReference.Value, cellReference,
                                                  StringComparison.OrdinalIgnoreCase) > 0);
 
            var newCell = new Cell {CellReference = cellReference};
            row.InsertBefore(newCell, refCell);
 
            worksheet.Save();
            return newCell;
        }
    }
}
предполагается, что у нас есть уже экселевский документ. См. вложение.

Также напоминаю, что xlsx (как и docx) формат - это обычный архив, его можно открыть с помощью того же винрара и посмотреть, что внутри Данные лежат в файликах Sheed1, Sheet2 и тд. (например в случае выше - это путь result.xlsx\xl\worksheets\sheet1.xml)
2
Вложения
Тип файла: rar OpenExcelTest.rar (3.28 Мб, 55 просмотров)
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
19.01.2015, 19:09 10
Psilon, спасибо, ты дал даже больше чем я предполагал)
пример работает, а только вот с моим реальным документом не пашет( После операции записи и его открытия в екселе пишет что файл поврежден - востановить, да, нет?
Жму да - файл отображается, а измененная ячейка пуста(((
походу твой пример запарывает ее(((
пс ексель 2013

Добавлено через 10 минут
а сорри, я же не в пустую ячейку пишу((
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.01.2015, 22:37 11
jenokizm, это тольк опример А что ты запарол в разметке можешь посмотреть, открыв через винрар документ, как я показывал. Чтобы наглядно понимать, где накосячил, очень полезно
0
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
20.01.2015, 12:23 12
Psilon, спс. пусть будет твой ответ лучшим)
1
20.01.2015, 12:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2015, 12:23

Невозможно загрузить файл или сборку "Microsoft.Office.Interop.Excel" при переносе приложения на другой ПК
есть приложение Windows Form. На форме есть button, при нажатии на который...

Найти и заменить слова в документе (doc) без Microsoft.Office.Interop.Word
Добрый день! Существует ли способ с помощью оного я мог бы найти и заменить...

Excel Interop для всех версий MS Office
Здравствуйте, возникла проблема в работе с библиотекой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru