Как мне объединить больше документов Excel в одном с NPOI? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь объединить больше документов Excel в один документ, используя NPOI.Вот код записи: ``

static void Main(string[] args)
    {
        DataTable dt = new DataTable();
        string[] files = new string[] { @"C:\Users\Ionut\source\repos\ExcelMergeDocument\ExcelMergeDocument\bin\Debug\TAMUExport\Project1\Report3Item.xls",
        @"C:\Users\Ionut\source\repos\ExcelMergeDocument\ExcelMergeDocument\bin\Debug\TAMUExport\Project2\Report3Item.xls"};
        for (int i = 0; i < files.Length; i++)
        {

            MergeData(files[i], dt);
        }
        ExportEasy(dt, finalImagePathReport3full);
    }

    public static string imagePathReport3full = @"\ResultReport3Item.xls";

    public static string finalImagePathReport3full = AssemblyDirectory + imagePathReport3full;


    public static string AssemblyDirectory
    {
        get
        {
            string codeBase = Assembly.GetExecutingAssembly().CodeBase;
            UriBuilder uri = new UriBuilder(codeBase);
            string path = Uri.UnescapeDataString(uri.Path);
            return System.IO.Path.GetDirectoryName(path);
        }
    }

    private static void MergeData(string path, DataTable dt)
    {
        XSSFWorkbook workbook = new XSSFWorkbook(path);
        XSSFSheet sheet = (XSSFSheet)workbook.GetSheetAt(0);
        XSSFRow headerRow = (XSSFRow)sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;
        if (dt.Rows.Count == 0)
        {
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                dt.Columns.Add(column);
            }
        }
        else
        {
        }

        int rowCount = sheet.LastRowNum + 1;
        for (int i = (sheet.FirstRowNum + 1); i < rowCount; i++)
        {
            XSSFRow row = (XSSFRow)sheet.GetRow(i);
            DataRow dataRow = dt.NewRow();
            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                if (row.GetCell(j) != null)
                    dataRow[j] = row.GetCell(j).ToString();
            }
            dt.Rows.Add(dataRow);
        }
        workbook = null;
        sheet = null;
    }
    public static void ExportEasy(DataTable dtSource, string strFileName)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
        HSSFRow dataRow = (HSSFRow)sheet.CreateRow(0);
        foreach (DataColumn column in dtSource.Columns)
        {
            dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
        }
        for (int i = 0; i < dtSource.Rows.Count; i++)
        {
            dataRow = (HSSFRow)sheet.CreateRow(i + 1);
            for (int j = 0; j < dtSource.Columns.Count; j++)
            {
                dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());
            }
        }
        using (MemoryStream ms = new MemoryStream())
        {
            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(fs);
            }
        }
    }
}

При запуске у меня появляется следующая ошибка:

ICSharpCode.SharpZipLib.Zip.ZipException: 'Не удается найти центральный каталог'

что я должен был делать?

NPUI работает только с расширением .xlsx?У меня есть единственное расширение .xls для документа Excel.Но когда я запускаю программу с расширением .xlsx, у меня возникает другая ошибка:

System.IO.InvalidDataException: 'Zip File is closed'

Обе ошибки появляются наэта строка кода: рабочая книга XSSFWorkbook = новая XSSFWorkbook (путь);

1 Ответ

0 голосов
/ 25 октября 2018

Это изменение, которое я делаю для кода:

private static void MergeData(string path, DataTable dt)
    {
        // HSSFWorkbook workbook = new HSSFWorkbook(path);
        HSSFWorkbook workbook;
        using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            workbook = new HSSFWorkbook();
        }
        HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0);
        HSSFRow headerRow = (HSSFRow)sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;
        if (dt.Rows.Count == 0)
        {
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                dt.Columns.Add(column);
            }
        }
        else
        {
        }

        int rowCount = sheet.LastRowNum + 1;
        for (int i = (sheet.FirstRowNum + 1); i < rowCount; i++)
        {
            HSSFRow row = (HSSFRow)sheet.GetRow(i);
            DataRow dataRow = dt.NewRow();
            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                if (row.GetCell(j) != null)
                    dataRow[j] = row.GetCell(j).ToString();
            }
            dt.Rows.Add(dataRow);
        }
        workbook = null;
        sheet = null;
    }

Теперь в этой строке кода: `

 HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0);

он говорит мне System.ArgumentOutOfRangeException:Индекс был вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index '. Я читал об этой ошибке и знаю, что инициализировать индекс или создать его, я тоже пытался, но безрезультатно.Что я делаю не так или, может быть, где предполагается инициализировать индекс?Остальной код такой же, как и на предыдущей панели, только эту пустоту я изменил в документе Merge .xls.

...