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

Работа с документами Excel без Microsoft.Office.Interop.Excel - C#/.NET 3.x

28.11.2014, 18:21. Просмотров 2916. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 3.x Работа с документами Excel без Microsoft.Office.Interop.Excel (C#):

Некорректная работа с 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...

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

11
Metall_Version
2116 / 1253 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 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
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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 Мб, 47 просмотров)
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
19.01.2015, 19:09 #10
Psilon, спасибо, ты дал даже больше чем я предполагал)
пример работает, а только вот с моим реальным документом не пашет( После операции записи и его открытия в екселе пишет что файл поврежден - востановить, да, нет?
Жму да - файл отображается, а измененная ячейка пуста(((
походу твой пример запарывает ее(((
пс ексель 2013

Добавлено через 10 минут
а сорри, я же не в пустую ячейку пишу((
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

Microsoft.Office.Interop для всех версий MS Office
Здравствуйте! Нашёл кучу околоподобных тем, но без нужных решений. Задача...

Microsoft.Office.Tools.Excel.dll
Добрый день. Подскажите пожалуйста где можно скачать ...


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

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

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