Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Открыть файлы Excel

Есть у кого исходник программы на C#(Windows Form), которая открывает .xlsx файлы(Excel)?
Ответ: Если у вас есть Excel файл, в котором есть лист с названием "Лист1" и на этом листе есть данные начиная с ячейки А1 и далее (предположим, что в 1-й строке идут названия столбцов (например, количество, цена и т.д.), то

- добавьте на форму Button1 и dataGriedView
- добавьте ссылку на библиотеку Microsoft Excel x.x Object Library (где вместо x.x будет версия Excel - 14.0 или 15.0)

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Data;
using System.Windows.Forms;
using Microsoft.Office.Interop;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //поиск файла Excel
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Multiselect =false;
            ofd.DefaultExt = "*.xls;*.xlsx";
            ofd.Filter = "Microsoft Excel (*.xls*)|*.xls*";
            ofd.Title = "Выберите документ Excel";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                MessageBox.Show("Вы не выбрали файл для открытия", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string xlFileName = ofd.FileName; //имя нашего Excel файла
            
            //рабоата с Excel
            Excel.Range Rng;            
            Excel.Workbook xlWB;
            Excel.Worksheet xlSht;
            int iLastRow, iLastCol;
 
            Excel.Application xlApp = new Excel.Application(); //создаём приложение Excel
            xlWB = xlApp.Workbooks.Open(xlFileName); //открываем наш файл           
            xlSht = xlWB.Worksheets["Лист1"]; //или так xlSht = xlWB.ActiveSheet //активный лист
 
            iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row; //последняя заполненная строка в столбце А
            iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке
 
            Rng = (Excel.Range)xlSht.Range["A1", xlSht.Cells[iLastRow, iLastCol]]; //пример записи диапазона ячеек в переменную Rng
            //Rng = xlSht.get_Range("A1", "B10"); //пример записи диапазона ячеек в переменную Rng
            //Rng = xlSht.get_Range("A1:B10"); //пример записи диапазона ячеек в переменную Rng
            //Rng = xlSht.UsedRange; //пример записи диапазона ячеек в переменную Rng
 
            var dataArr = (object[,])Rng.Value; //чтение данных из ячеек в массив            
            //xlSht.get_Range("K1").get_Resize(dataArr.GetUpperBound(0), dataArr.GetUpperBound(1)).Value = dataArr; //выгрузка массива на лист
 
            //закрытие Excel
            xlWB.Close(true); //сохраняем и закрываем файл
            xlApp.Quit();            
            releaseObject(xlSht);
            releaseObject(xlWB);
            releaseObject(xlApp);
 
            //заполняем DataTable для последующего заполнения dataGridView
            DataTable dt = new DataTable();
            DataRow dtRow;
            //добавляем столбцы в DataTable
            for (int i = 1; i <= dataArr.GetUpperBound(1); i++)
                dt.Columns.Add((string)dataArr[1, i]);            
            
            //цикл по строкам массива
            for (int i = 2; i <= dataArr.GetUpperBound(0); i++)
            {
                dtRow = dt.NewRow();
                //цикл по столбцам массива
                for (int n = 1; n <= dataArr.GetUpperBound(1); n++)
                {
                    dtRow[n-1] = dataArr[i, n];
                }
                dt.Rows.Add(dtRow);
            }
 
            this.dataGridView1.DataSource = dt; //заполняем dataGridView
 
            MessageBox.Show("Конец", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
 
        }
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        } 
    
    }
}
Вопрос: Как обновить файл Excel со многими формулами, без

Всем привет!
Надо обновить существующий файл Excel со многими формулами.
Версия Apache POI 3.16

Я знаю, что API Apache POI сам предоставляет FomulaEvаluator, но определенные формулы не поддерживаются POI Apache.
Использовать функцию евалуате нельзя так-как файл Excel содержит формулы, не поддерживаемые Apache POI. 

Я могу удалить кэшированные результаты из файла (после обновления), но я не могу сохранить новый файл с новыми кешированными результатами.
Для этого нужно открыть Excel обычным способом и только тогда кэшируются новые значения.

Может ли кто-нибудь помочь получить решение без открытия Excel и без использования FormulaEvaluator ?

Заранее благодарен и с уважением
Hehabr

–--------------------------------------------------------------------

Как выглядит Excel-файл: 



Вывод программы:

Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 6.0
Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 0.0

–--------------------------------------------------------------------

Код: 
Код

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class POITestRB {

    static String excelFileOrig = "C:/Test/1.xlsm";
    static String excelFileNew = "C:/Test/excelFileNew.xlsm";
    static FileInputStream fis;
    static XSSFWorkbook workbook;

    public static void main(String[] args) throws IOException {

        fis = new FileInputStream(excelFileOrig);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        updateCell(workbook, 10.0);
        fis.close();
        workbook.close();

        fis = new FileInputStream(excelFileNew);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        fis.close();
        workbook.close();

    }

    public static void updateCell(XSSFWorkbook workbook, Double newData) {
        try {
            XSSFSheet sheet = workbook.getSheetAt(1);
            CellReference ref = new CellReference("C8");
            int row = ref.getRow();
            int col = ref.getCol();
            Cell cell = sheet.getRow(row).getCell(col);
            if (cell != null) {
                cell.setCellValue(newData);
            }

            workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();
            workbook.setForceFormulaRecalculation(true);

            cleenCach(workbook);

            OutputStream os = new FileOutputStream(excelFileNew);
            workbook.write(os);
            os.flush();
            os.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void cleenCach(XSSFWorkbook workbook) {
        for (Sheet sheet : workbook) {
            for (Row r : sheet) {
                for (Cell c : r) {
                    if (c.getCellTypeEnum() == CellType.FORMULA) {
                        String temp = c.getCellFormula();
                        c.setCellType(CellType.STRING);
                        c.setCellType(CellType.FORMULA);
                        c.setCellFormula(temp);
                    }
                }
            }
        }
    }


    private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {

        workbook.setForceFormulaRecalculation(true);

        XSSFSheet sheet = workbook.getSheetAt(1);
        CellReference ref = new CellReference(cellId);
        int row = ref.getRow();
        int col = ref.getCol();
        Cell cell = sheet.getRow(row).getCell(col);

        switch (cell.getCellTypeEnum()) {
            case STRING:
                System.out.println(cell.getRichStringCellValue().getString());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.println(cell.getDateCellValue());
                } else {
                    System.out.println(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case FORMULA:
                System.out.println("Formula is: " + cell.getCellFormula());
                System.out.println("cell.getCachedFormulaResultType(): " + cell.getCachedFormulaResultType());

                switch(cell.getCachedFormulaResultType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.println("0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.println("4. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        System.out.println("5. case Cell.CELL_TYPE_ERROR --> ");
                        break;
                }
                break;
            case BLANK:
                System.out.println();
                break;
            default:
                System.out.println("default");
        }
    }

}


Ответ:
Всем привет!
Надо обновить существующий файл Excel со многими формулами.
Версия Apache POI 3.16

Я знаю, что API Apache POI сам предоставляет FomulaEvаluator, но определенные формулы не поддерживаются POI Apache.
Использовать функцию евалуате нельзя так-как файл Excel содержит формулы, не поддерживаемые Apache POI. 

Я могу удалить кэшированные результаты из файла (после обновления), но я не могу сохранить новый файл с новыми кешированными результатами.
Для этого нужно открыть Excel обычным способом и только тогда кэшируются новые значения.

Может ли кто-нибудь помочь получить решение без открытия Excel и без использования FormulaEvaluator ?

Заранее благодарен и с уважением
Hehabr

–--------------------------------------------------------------------

Как выглядит Excel-файл: 



Вывод программы:

Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 6.0
Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 0.0

–--------------------------------------------------------------------

Код: 
Код

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class POITestRB {

    static String excelFileOrig = "C:/Test/1.xlsm";
    static String excelFileNew = "C:/Test/excelFileNew.xlsm";
    static FileInputStream fis;
    static XSSFWorkbook workbook;

    public static void main(String[] args) throws IOException {

        fis = new FileInputStream(excelFileOrig);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        updateCell(workbook, 10.0);
        fis.close();
        workbook.close();

        fis = new FileInputStream(excelFileNew);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        fis.close();
        workbook.close();

    }

    public static void updateCell(XSSFWorkbook workbook, Double newData) {
        try {
            XSSFSheet sheet = workbook.getSheetAt(1);
            CellReference ref = new CellReference("C8");
            int row = ref.getRow();
            int col = ref.getCol();
            Cell cell = sheet.getRow(row).getCell(col);
            if (cell != null) {
                cell.setCellValue(newData);
            }

            workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();
            workbook.setForceFormulaRecalculation(true);

            cleenCach(workbook);

            OutputStream os = new FileOutputStream(excelFileNew);
            workbook.write(os);
            os.flush();
            os.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void cleenCach(XSSFWorkbook workbook) {
        for (Sheet sheet : workbook) {
            for (Row r : sheet) {
                for (Cell c : r) {
                    if (c.getCellTypeEnum() == CellType.FORMULA) {
                        String temp = c.getCellFormula();
                        c.setCellType(CellType.STRING);
                        c.setCellType(CellType.FORMULA);
                        c.setCellFormula(temp);
                    }
                }
            }
        }
    }


    private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {

        workbook.setForceFormulaRecalculation(true);

        XSSFSheet sheet = workbook.getSheetAt(1);
        CellReference ref = new CellReference(cellId);
        int row = ref.getRow();
        int col = ref.getCol();
        Cell cell = sheet.getRow(row).getCell(col);

        switch (cell.getCellTypeEnum()) {
            case STRING:
                System.out.println(cell.getRichStringCellValue().getString());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.println(cell.getDateCellValue());
                } else {
                    System.out.println(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case FORMULA:
                System.out.println("Formula is: " + cell.getCellFormula());
                System.out.println("cell.getCachedFormulaResultType(): " + cell.getCachedFormulaResultType());

                switch(cell.getCachedFormulaResultType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.println("0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.println("4. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        System.out.println("5. case Cell.CELL_TYPE_ERROR --> ");
                        break;
                }
                break;
            case BLANK:
                System.out.println();
                break;
            default:
                System.out.println("default");
        }
    }

}


Вопрос: Как обновить файл Excel со многими формулами, без эвалюации, в Apache POI ?

Всем привет!
Надо обновить существующий файл Excel со многими формулами.
Версия Apache POI 3.16

Я знаю, что API Apache POI сам предоставляет FomulaEvаluator, но определенные формулы не поддерживаются POI Apache.
Использовать функцию евалуате нельзя так-как файл Excel содержит формулы, не поддерживаемые Apache POI.

Я могу удалить кэшированные результаты из файла (после обновления), но я не могу сохранить новый файл с новыми кешированными результатами.
Для этого нужно открыть Excel обычным способом и только тогда кэшируются новые значения.

Может ли кто-нибудь помочь получить решение без открытия Excel и без использования FormulaEvaluator ?

Заранее благодарен и с уважением
Hehabr

–--------------------------------------------------------------------

Как выглядит Excel-файл:



Вывод программы:

Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 6.0
Formula is: C34
cell.getCachedFormulaResultType(): 0
0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: 0.0

–--------------------------------------------------------------------

Код:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class POITestRB {

    static String excelFileOrig = "C:/Test/1.xlsm";
    static String excelFileNew = "C:/Test/excelFileNew.xlsm";
    static FileInputStream fis;
    static XSSFWorkbook workbook;

    public static void main(String[] args) throws IOException {

        fis = new FileInputStream(excelFileOrig);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        updateCell(workbook, 10.0);
        fis.close();
        workbook.close();

        fis = new FileInputStream(excelFileNew);
        workbook = new XSSFWorkbook(fis);
        gettingCellContents(workbook, "D5");
        fis.close();
        workbook.close();

    }

    public static void updateCell(XSSFWorkbook workbook, Double newData) {
        try {
            XSSFSheet sheet = workbook.getSheetAt(1);
            CellReference ref = new CellReference("C8");
            int row = ref.getRow();
            int col = ref.getCol();
            Cell cell = sheet.getRow(row).getCell(col);
            if (cell != null) {
                cell.setCellValue(newData);
            }

            workbook.getCreationHelper().createFormulaEvaluator().clearAllCachedResultValues();
            workbook.setForceFormulaRecalculation(true);

            cleenCach(workbook);

            OutputStream os = new FileOutputStream(excelFileNew);
            workbook.write(os);
            os.flush();
            os.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void cleenCach(XSSFWorkbook workbook) {
        for (Sheet sheet : workbook) {
            for (Row r : sheet) {
                for (Cell c : r) {
                    if (c.getCellTypeEnum() == CellType.FORMULA) {
                        String temp = c.getCellFormula();
                        c.setCellType(CellType.STRING);
                        c.setCellType(CellType.FORMULA);
                        c.setCellFormula(temp);
                    }
                }
            }
        }
    }


    private static void gettingCellContents(XSSFWorkbook workbook, String cellId) {

        workbook.setForceFormulaRecalculation(true);

        XSSFSheet sheet = workbook.getSheetAt(1);
        CellReference ref = new CellReference(cellId);
        int row = ref.getRow();
        int col = ref.getCol();
        Cell cell = sheet.getRow(row).getCell(col);

        switch (cell.getCellTypeEnum()) {
            case STRING:
                System.out.println(cell.getRichStringCellValue().getString());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.println(cell.getDateCellValue());
                } else {
                    System.out.println(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case FORMULA:
                System.out.println("Formula is: " + cell.getCellFormula());
                System.out.println("cell.getCachedFormulaResultType(): " + cell.getCachedFormulaResultType());

                switch(cell.getCachedFormulaResultType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.println("0. case Cell.CELL_TYPE_NUMERIC --> Last evaluated as: " + cell.getNumericCellValue());
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.println("4. case Cell.CELL_TYPE_STRING --> Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        System.out.println("5. case Cell.CELL_TYPE_ERROR --> ");
                        break;
                }
                break;
            case BLANK:
                System.out.println();
                break;
            default:
                System.out.println("default");
        }
    }

}
Ответ: Hehabr,

По-моему, ответ очевиден. Раз evaluator использовать нельзя и открывать в excel тоже нельзя, считай сам, "на калькуляторе". Или думаешь, что есть другие, более волшебные варианты?
Вопрос: счётесли или суммесли разных файлов excel и сохранение и запрет изменений внесённых данных

Добрый день.
Прошу помощи в решении вопроса.
см. приложенный файл

Суть№1 основная:
У каждого на компьютере есть файл Excel (в примере всё в одном файле).
В каждом листе содержатся данные участника.
Конкретному участнику в его листе предложено согласие от других участников.
Если он нажал галочку, то его "да" считается или суммируется к "да" других согласных и отображается в ячейке I2 (отмечено цветом) листа участника с которым они согласились.
Вот это я и стараюсь сделать.

Суть№2:
Как можно сделать чтоб:
Информация по текущей дате входа фиксировалась в верхней позиции с защитой от изменений этой даты.
Информация за прошедшие даты сохранялась ниже и её нельзя было изменить (отредактировать, удалить).
(в примере Лист фио1 отмечено цветом)

Я еще подумаю: Возможно как вариант текущая инфа участников передаётся на лист Архив! и Свод! и записывается там.
А после может синхронизироватся в прошедшую инфу в файлах участников которые тоже могут содержать лист Архив участника.


Суть№3:
(в примере дата зависит от изменений ячеек столбца А)
Как сделать чтоб дата входа отображалась при открытии файла.
А лучше при загрузки системы.
Ответ: Я понимаю что есть сложные вещи в excel как сохранение без изменений.
Я бы очень хотел чтоб у кого нибудь получилось помочь мне с СЧЁЧЕСЛИ или СУММЕСЛИ из разных книг (основная суть моего вопроса).
Возможно есть другие пути решения моих вопросов, которые мне пока неизвестны.
Уверен это может помочь еще кому нибудь.
Буду очень признателен.
Вопрос: Можно ли открыть битый файл Excel?

Всем привет!
Есть файл Excel, но при открытии вылетает ошибка. Нажимаю ДА, вылетает еще одна, потом снова ОК и файл открывается, данные есть. НО программно такие файлы не открываются. Можно ли обойти ошибку при программном открытии файла?

К сообщению приложен файл. Размер - 28Kb
Ответ:
kos20
Antonariy
это же просто zip-архив с xml-файлом. вытаскиваешь xml, исправляешь ошибку, засовываешь обратно, и вуаля.


У меня таких файлов порядка 300 =)
и все битые? соболезную.
Вопрос: История изменения в файле Excel

Всем прив есть трабл (( файл Excel, изначально не отформатирован должным образом, нужна вся информация по изменениям в нем. Стандартными средствами приложения этого не сделать. У кого есть решения - отпишитесь. Возможно финансовое вознгржд
Ответ: Нужно сделать файл, чтобы в нем фиксировались изменения для последующего отслеживания,
или нужно извлечь историю изменений из существующего файла Excel?
(второе невозможно, если файл не был в общем доступе)
Вопрос: Замена текста в ячейках файла Excel

Подскажите, пожалуста, кто знает, как в файле excel из Delphi подменить символы на нужные)
Ответ: Даниил Пакоv,

начните поиск в гугле с такого запроса и посмотрите подряд первые 10 топиков:
delphi CreateOLEObject('Excel.Application')
Вопрос: Большая работа с Excel (передача в него данных, построение графиков, дозапись, создание нового файла Excel)

Всем участниками большой привет. Снова нужна помощь.
Что имеем:
-Имеем форму во вложении. на ней есть 30 нужных нам текстбоксов, начиная с "брутто 1х весов" и далее.
-Имеем время обновления, т.е. то время когда отработал запрос к датчику по таймеру.
-Имеем файл Excel (пример во вложении).
Что нужно:
-Каждый новый день создавать новый файл Excel и называть его текущей датой, т.е. сегодня (24.11.2016)-так и назвать файл, завтра новый файл с именем 25.11.2016.
-В этот файл будут записываться показания с определенным интервалом (~30 минут) показания с текстбоксов (пример заполнения excel файла во вложении) т.е. каждые 30 мин новые данные должны записываться в файл ниже и ниже и ниже и т.д.. При изменении даты записываются в новый файл с текущей датой.
-На основании записанных данных в Excel'е построить график по столбцу "Вес на датчике (кг)" исключая сумму ячеек.
Всё должно работать в автомате...
На данный момент имею только запись в файл, и то он перезаписывается, не пойму что не так... Не особо работал со связью данных с Excel.
Help me pls!

То что есть:
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
application = new Application { DisplayAlerts = false };
            const string template = "template.xlsx";
            workBook = application.Workbooks.Open(Path.Combine(Environment.CurrentDirectory, template));
            worksheet = workBook.ActiveSheet as Worksheet;
 
 
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2:C2"].Merge(false);
            (worksheet.Cells as Excel.Range).HorizontalAlignment = Excell.XlHAlign.xlHAlignCenter;
            (worksheet.Cells as Excel.Range).VerticalAlignment = Excell.XlVAlign.xlVAlignCenter;
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2"].Value = toolStripStatusLabel1.Text;
            worksheet.Range["A3"].Value = "Номер датчика";
            int n = 3;
            for (int i = 1; i < 13; i++)
            {
                worksheet.Range["A" + (n + i)].Value = Convert.ToString(i);
                if (i == 12)
                {
                    worksheet.Range["A16"].Value = "Сумма ячеек:";
                    worksheet.Range["A18"].Value = "Брутто 1-х весов:";
                    worksheet.Range["A19"].Value = "Брутто 2-х весов:";
                    worksheet.Range["A20"].Value = "Сумма брутто:";
                    worksheet.Range["A21"].Value = "Коэффициент:";
                }
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["B3"].Value = "Значения ячеек";
            int zn_ya = 4;
            System.Windows.Forms.TextBox[] tbs = { textBox8, textBox9, textBox10, textBox11, textBox12, textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, textBox19 };
            for (int i = 0; i < 12; i++)
            {
                worksheet.Range["B" + (zn_ya + i)].Value = tbs[i].Text;
                if (i == 11)
                {
                    worksheet.Range["B16"].Value = textBox20.Text;
                    worksheet.Range["B18"].Value = textBox4.Text;
                    worksheet.Range["B19"].Value = textBox5.Text;
                    worksheet.Range["B20"].Value = textBox6.Text;
                    worksheet.Range["B21"].Value = textBox7.Text;
                }
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["C3"].Value = "Вес на датчике (кг)";
            int ves = 4;
            System.Windows.Forms.TextBox[] tbs2 = { textBox21, textBox22, textBox23, textBox24, textBox25, textBox26, textBox27, textBox28, textBox29, textBox30, textBox31, textBox32 };
            for (int i = 0; i < 12; i++)
            {
                worksheet.Range["C" + (ves + i)].Value = tbs2[i].Text;
                if (i == 11) worksheet.Range["C16"].Value = textBox33.Text;
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2:C2"].EntireColumn.AutoFit();
            string savedFileName = "template.xlsx";
            workBook.SaveAs(Path.Combine(Environment.CurrentDirectory, savedFileName));
            CloseExcel();
        }
 
        private void CloseExcel()
        {
            if (application != null)
            {
                int excelProcessId = -1;
                GetWindowThreadProcessId(application.Hwnd, ref excelProcessId);
                Marshal.ReleaseComObject(worksheet);
                workBook.Close();
                Marshal.ReleaseComObject(workBook);
                application.Quit();
                Marshal.ReleaseComObject(application);
                application = null;
                try
                {
                    Process process = Process.GetProcessById(excelProcessId);
                    process.Kill();
                }
                finally { }
            }
        }
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(int hWnd, ref int lpdwProcessId);
Ответ: FreedlN, тебе нужен не обычный файл xlsx, а шаблон xltx. Как во вложении. На его основе создавать новый файл, копировать шаблон данных, вставлять его ниже, заполнять новыми данными, копировать диаграмму, смещать её вниз, менять у неё источник данных.
Для приложенного шаблона я попробовал реализовать экспорт:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
 
namespace OutputToExcel
{
    public static class ExcelHelper
    {
        [DllImport("user32.dll", SetLastError = true)]
        private static extern uint GetWindowThreadProcessId(int hWnd, ref int lpdwProcessId);
        /// <summary> Имя файла шаблона</summary>
        public static string TemplateFile { get; set; }
        /// <summary> Дата последнего сохранения </summary>
        private static DateTime _lastDate;
        /// <summary> Последнее имя файла </summary>
        private static string _lastFileName;
        /// <summary> Индекс последней строки </summary>
        private static long _lastRowIndex;
 
        private static dynamic _xlApp;
        private static dynamic _xlWorkbook;
        private static dynamic _xlWorksheet;
 
        /// <summary>
        /// Экспорт данных в Excel
        /// </summary>
        /// <param name="cellValues">Значения ячеек</param>
        /// <param name="weightOnSensors">Вес на датчиках</param>
        /// <param name="brutto1">Брутто 1-х весов</param>
        /// <param name="brutto2">Брутто 2-х весов</param>
        /// <param name="koef">Коэффициент</param>
        public static void Export(double[] cellValues, double[] weightOnSensors, double brutto1, double brutto2, double koef)
        {
            _xlApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
            _xlApp.Visible = true;
            //Если даты не совпадают
            if (!DateTime.Now.Date.Equals(_lastDate.Date))
            {
                //Создаётся новый файл на основе шаблона
                _xlWorkbook = _xlApp.Workbooks.Add(TemplateFile);
                _lastDate = DateTime.Now;//меняется последняя дата
                _lastRowIndex = 21;//Сбрасывается указатель на последнюю строку
                //Формируется новое имя файла
                _lastFileName = string.Format("{0}.xlsx", _lastDate.ToString("dd.MM.yyyy"));
                //Файл сохраняется
                _xlWorkbook.SaveAs(Path.Combine(Environment.CurrentDirectory, _lastFileName));
                _xlWorksheet = _xlWorkbook.ActiveSheet;
            }
            else
            {
                //Открывается файл с соответствующим именем
                _xlWorkbook = _xlApp.Workbooks.Open(Path.Combine(Environment.CurrentDirectory, _lastFileName));
                _lastDate = DateTime.Now;
                _xlWorksheet = _xlWorkbook.ActiveSheet;
                CopyRange();
            }
            //Значения ячеек
            for (var i = 0; i < cellValues.Length; i++)
                _xlWorksheet.Range[string.Format("B{0}", i + _lastRowIndex - 17)].Value = cellValues[i];
            //Вес на датчике
            for (var i = 0; i < weightOnSensors.Length; i++)
                _xlWorksheet.Range[string.Format("C{0}", i + _lastRowIndex - 17)].Value = weightOnSensors[i];
            //Заголовок
            _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex - 19)].Value = string.Format("Время обновления {0:dd.MM.yyyy HH:mm:ss}", _lastDate);
            //Брутто 1-х весов
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex - 3)].Value = brutto1;
            //Брутто 2-х весов
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex - 2)].Value = brutto2;
            //Коэффициент
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex)].Value = koef;
 
            _xlWorkbook.Save();
 
            CloseExcel(_xlApp, _xlWorkbook, _xlWorksheet);
        }
 
        /// <summary>
        /// Копирование диапазона ячеек и диаграммы
        /// </summary>
        private static void CopyRange()
        {
            //Новый диапазон ячеек под заполнененными строками. На 2 строки дальше последней заполненной
            dynamic newRange = _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex + 2)];
            //Копируем данные в новый диапазон ячеек
            _xlWorksheet.Range[string.Format("A{0}:C{1}", _lastRowIndex - 19, _lastRowIndex)].Copy(newRange);
            //Последняя диаграмма на листе. Создаём её дубликат
            dynamic chart = _xlWorksheet.ChartObjects[_xlWorksheet.ChartObjects.Count].Duplicate();
            //Меняем указатель на последнюю строку
            _lastRowIndex += 21;
            //Левая и верхняя координаты для позиционирования новой диаграммы
            double left = _xlWorksheet.Range[string.Format("E{0}", _lastRowIndex - 17)].Left;
            double top = _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex - 17)].Top;
            //Перемещаем диаграмму
            chart.Left = left; chart.Top = top;
            //Меняем диапазон, отображаемый на диаграмме
            chart.Chart.SetSourceData(Source: _xlWorksheet.Range[string.Format("C{0}:C{1}", _lastRowIndex - 17, _lastRowIndex - 6)]);
        }
 
        /// <summary>
        /// Освобождение ресурсов
        /// </summary>
        /// <param name="xlApp">Ссылка на приложение</param>
        /// <param name="xlWorkbook">Ссылка на книгу</param>
        /// <param name="xlWorksheet">Ссылка на лист</param>
        private static void CloseExcel(dynamic xlApp, dynamic xlWorkbook, dynamic xlWorksheet)
        {
            if (xlApp == null) return;
            int excelProcessId = -1;
            GetWindowThreadProcessId(xlApp.Hwnd, ref excelProcessId);
            Marshal.ReleaseComObject(xlWorksheet);
            Marshal.ReleaseComObject(xlWorkbook);
            Marshal.ReleaseComObject(xlApp);
            xlApp = null;
            try
            {
                Process process = Process.GetProcessById(excelProcessId);
                process.Kill();
            }
            catch { }
        }
    }
}
Экспорт выполняется вызовом метода Export с соответствующими параметрами. Осталось только допилить сохранение даты, имени файла и индекса последней строки между запусками программы в течение одного дня. Способов для этого предостаточно
Вопрос: Ошибка eolesyserror при открытии файла Excel

Доброго времени суток всем. Возникла проблема в довольно таки банальной операции, как чтение данных из файла. При отладке программа останавливает работу и открывает Ассемблер. К сожалению, пользоваться им не умею и на данном этапе быстро научиться не смогу. Пошаговая отладка показала, что ошибка возникает на моменте открытия файла. Буду очень благодарен каждому, кто своим опытным взглядом заметит огрехи и даст совет, как их исправить.
Pascal
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
unit unitCalcP;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, ComObj, Variants, Graphics, Controls,
  Forms, Dialogs,Windows, Messages, Grids, StdCtrls;
 
type
  Tmass = array of array of extended;
 
var
  XlsOp:Tmass;
  row,com:integer;
 
// Расчет высоты и широты от интервала времени по сравнению с начальным моментом
   function CalcHShDolg(a,e,i,w,dvy,dt:double):double;
 
// Расчет статистических распределений по Каталогу ИПМ
   procedure CalcIPMStats(fCatIPM:string);    // Файл с данными
// Расчет концентрации по Каталогу ИПМ
   procedure CalcIMPConce(fCatIPM:string);    // Файл с данными
// чтение файла Excel(xls)
   procedure Xls_open(XLSFile:string; MassExcel:Tmass);
 
 
implementation
 
 
// чтение файла Excel(xls)
   procedure Xls_open(XLSFile:string; MassExcel:Tmass);
    const
      xlCellTypeLastCell=$0000000B;
    var
      ExlApp, Sheet: OLEVariant;
      i,j:integer;
    begin
      //создаем объект Excel
      ExlApp:=CreateOleObject('Excel.Application');
 
      //делаем окно Excel невидимым
      ExlApp.Visible:= false;
 
      //открываем файд XLSFile
      ExlApp.Workbooks.Open(XLSFile);
 
      //создаем объект Sheet(страница) и указываем номер листа(1)
      //в книге, с которой будем осуществлять чтение
      Sheet:=ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];
 
      //активируем последнюю ячейку на листе
      Sheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
 
      //Возвращает номер последней строки
      row:=ExlApp.ActiveCell.Row;
 
      //Возвращает номер последнего столбца
      com:=ExlApp.ActiveCell.Column;
 
      //устанавливаем кол-во столбцов и строк в динамическом массиве
      setlength(MassExcel,row,6);
      //считываем значение из каждой ячейки и копируем в наш массив
      for i:=1 to row do
          for j:=8 to 13 do
              MassExcel[i-1,j-8]:=StrToFloat(sheet.cells[j-7,i]);
 
      //закрываем приложение Excel
      ExlApp.Quit;
 
      //очищаем выделенную память
      ExlApp:=Unassigned;
      Sheet:=Unassigned;
    end;
 
// Расчет статистических распределений по Каталогу ИПМ
   procedure CalcIPMStats(fCatIPM:string);    // Файл с данными
   var
     a,e,i,w,dvy,T:double;
   begin
     // Считываение файла
    Xls_open('adaps-orb-160907-132434.xlsx',XlsOp);
 
   end;
 
// Расчет концентрации по Каталогу ИПМ
   procedure CalcIMPConce(fCatIPM:string);    // Файл с данными
   begin
 
   end;
 
// Расчет высоты и широты от интервала времени по сравнению с начальным моментом
   function CalcHShDolg(a,e,i,w,dvy,dt:double):double;
   var
     H,Sh,Dolg:double;
   begin
 
     H:=0;
     Sh:=0;
     Dolg:=0;
   end;
 
end.
Pascal
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
unit unitMainForm;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,
  Dialogs, StdCtrls, unitCalcSpaceDebris;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    EditH: TEdit;
    EditI: TEdit;
    EditSh: TEdit;
    EditdSh: TEdit;
    EditHn: TEdit;
    Edite: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
uses unitCalcP;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,z:integer;
begin
      i:=0;
      //Memo1.Lines.Add(FloatToStrF(TdtH(StrToFloat(EditH.Text),StrToFloat(EditSh.Text),StrToFloat(EditdSh.Text),StrToFloat(EditHn.Text)) ,ffFixed,5,5 ) ) ;
      //Chart1LineSeries1.AddY     (TdtH(StrToFloat(EditH.Text),StrToFloat(EditSh.Text),StrToFloat(EditdSh.Text),StrToFloat(EditHn.Text)));
      Xls_open('adaps-orb-160907-132434.xlsx',XlsOp);
      for i:=1 to row do
       for j:=1 to 6 do
         Memo1.Lines[i]:= Memo1.Lines[i]+' '+FloatToStr(XlsOp[i,j]);
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,z:integer;
begin
      Memo1.Lines.Add(FloatToStrF(TdtSh(StrToFloat(EditdSh.Text),StrToFloat(EditH.Text),
                      StrToFloat(EditSh.Text),StrToFloat(EditHn.Text),StrToFloat(Edite.Text),StrToFloat(Editi.Text)) ,ffFixed,5,5 ) ) ;
      Chart1LineSeries1.AddXY(i,TdtSh(StrToFloat(EditdSh.Text),StrToFloat(EditH.Text),
                      StrToFloat(EditSh.Text),StrToFloat(EditHn.Text),StrToFloat(Edite.Text),StrToFloat(Editi.Text)) );
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
 
  DefaultDataLEO();
  //CalcTLEStat('20.01.2015TLE_3line.txt',3);
   //НОО
     calculateTLEpHShDolg('01.09.2016.txt',
                             200,
                             40000,
                             //100,
 
 
                             90,
                             5,
 
 
                             360,
 
 
 
                             1440*1, // интервал моделирования для расчета концентрации
                             1);
 
end;
 
end.
Ответ: отработайте программу на текстовых файлах, потом переходите к excel (совет)

по теме - COM работает с WideString - возможно требуется преобразование (кастинг) при передачи строки с именем файла объекту COM:
Delphi
1
Sheet:=ExlApp.Workbooks[WideString(ExtractFileName(XLSFile))].WorkSheets[1];
Или - нужен полный путь к файлу указать, excel может быть не в курсе рабочего каталога приложения которое его вызывает....
Вопрос: Загрузка данных из файла Excel в DataGridView

Здравствуйте! Есть проблема.
Программа по нажатию кнопки на форме, должна считать файл Excel и поместить данные в датагрид на форме. Проблема в том, что в датагрид записывается только 3 столбца из 20...30. Как решить?
Вот код обработчика кнопки:
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
private void buttonImport_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Filter = "Файл Excel|*.XLSX;*.XLS";
            openDialog.ShowDialog();
 
            try
            {
                ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                //Книга.
                ObjWorkBook = ObjExcel.Workbooks.Open(openDialog.FileName);
                //Таблица.
                ObjWorkSheet = ObjExcel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;
                Microsoft.Office.Interop.Excel.Range rg = null;
 
                Int32 row = 1;
                dataGridViewMain.Rows.Clear();
                List<String> arr = new List<string>();
                while (ObjWorkSheet.get_Range("a" + row, "a" + row).Value != null)
                {
                    // Читаем данные из ячейки
                    rg = ObjWorkSheet.get_Range("a" + row, "c" + row);
                    foreach (Microsoft.Office.Interop.Excel.Range item in rg)
                    {
                        try
                        {
                            arr.Add(item.Value.ToString().Trim());
                        }
                        catch { arr.Add(""); }
                    }
                    dataGridViewMain.Rows.Add(arr[0], arr[1], arr[2]);
                    arr.Clear();
                    row++;
                }
 
                MessageBox.Show("Файл успешно считан!", "Считывания excel файла", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message, "Ошибка при считывании excel файла", MessageBoxButtons.OK, MessageBoxIcon.Error); }
            finally
            {
                ObjWorkBook.Close(false, "", null);
                // Закрытие приложения Excel.
                ObjExcel.Quit();
                ObjWorkBook = null;
                ObjWorkSheet = null;
                ObjExcel = null;
                GC.Collect();
            }
 
            this.Text = this.Text + " - " + openDialog.SafeFileName;
            textBoxFileName.Text = openDialog.SafeFileName;
        }
Ответ:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 private void загрузитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Excel (*.XLS)|*.XLS";
            opf.ShowDialog();
            DataTable tb = new DataTable();
            string filename = opf.FileName;
            string ConStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=Excel 8.0;", filename);
            System.Data.DataSet ds = new System.Data.DataSet("EXCEL");
            OleDbConnection cn = new OleDbConnection(ConStr);
            cn.Open();
            DataTable schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
            string select = String.Format("SELECT * FROM [{0}]", sheet1);
            OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);
            ad.Fill(ds);
            tb = ds.Tables[0];
            cn.Close();
            dataGridView1.DataSource = tb;
        }