2017-03-22 62 views
1

誰でも私のコードに何がないのか教えてください。エラーなしで実行されますが、Excelファイルには書き込まれません。私はスプレッドシートの[商業]タブのセルA1に書き込むようにしようとしています。OpenXMLを使用して既存のExcelファイルに書き込む

私のコードは以下の通りです:

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Reflection; 
using System.Data.OleDb; 
using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Spreadsheet; 
using System.Xml; 
using System.Diagnostics; 

namespace Application.Model 
{ 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public class TempCode :   Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
     string FilePath; 
     string FileName; 
     string FileExceptionsPath; 
     string FileExceptionsName; 
     string Exceptions = ""; 

    public void Main() 
    { 
     try 
     { 
      FilePath = (string)Dts.Variables["FilePath"].Value; 
      FileName = (string)Dts.Variables["User::FileName"].Value; 
      FileExceptionsPath = (string)Dts.Variables["FileExceptionsPath"].Value; 
      FileExceptionsName = (string)Dts.Variables["User::FileExceptionsName"].Value; 
      Dts.Variables["User::FileAbsolutePath"].Value = (string)Dts.Variables["FilePath"].Value + (string)Dts.Variables["User::FileName"].Value; 
      Dts.Variables["User::FileAbsoluteExceptionsPath"].Value = (string)Dts.Variables["FileExceptionsPath"].Value + (string)Dts.Variables["User::FileExceptionsName"].Value; 

      CreateExcel(new Object(), new EventArgs()); 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
     catch (Exception ex) 
     { 
      Dts.Events.FireError(0, "File Task", ex.Message, String.Empty, 0); 

      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 

    public void CreateExcel(object sender, EventArgs e) 
    { 
     Directory.CreateDirectory(FilePath); 

     string fileTest = FilePath + FileName; 
     if (File.Exists(fileTest)) 
     { 
      File.Delete(fileTest); 
     } 
     string templateTest = FilePath + "Test.xlsx"; 

     CopyFile(templateTest, fileTest); 

     UpdateCell(fileTest, "120", 1, "A"); 

     if (Exceptions != "") 
     { 
      LogExceptions(FileExceptionsPath, FileExceptionsName, Exceptions); 
     } 
    } 

    public void LogExceptions(string FileExceptionsPath, string FileExceptionsName, string data) 
    { 
     Directory.CreateDirectory(FileExceptionsPath); 
     using (var writer = new StreamWriter(FileExceptionsPath + FileExceptionsName)) 
     { 
      List<string> exceptionsList = data.Split('~').ToList(); 

      foreach (var ex in exceptionsList) 
      { 
       writer.WriteLine(ex, true); 
      } 
     } 
    } 

    private string CopyFile(string source, string dest) 
    { 
     string result = "Copied file"; 
     try 
     { 
      File.Copy(source, dest, true); 
     } 
     catch (Exception ex) 
     { 
      result = ex.Message; 
     } 
     return result; 
    } 

    public static void UpdateCell(string docName, string text, uint rowIndex, string columnName) 
    { 
     using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
     { 
      WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, "Commercial"); 
      if (worksheetPart != null) 
      { 
       Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex); 
       cell.CellValue = new CellValue(text); 
       cell.DataType = new EnumValue<CellValues>(CellValues.Number); 
       worksheetPart.Worksheet.Save(); 
      } 
      spreadSheet.WorkbookPart.Workbook.Save(); 
     } 

    } 

    private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName) 
    { 
     IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>(). 
         Elements<Sheet>().Where(s => s.Name == sheetName); 
     if (sheets.Count() == 0) 
     { 
      return null; 
     } 
     string relationshipId = sheets.First().Id.Value; 
     WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId); 
     return worksheetPart; 
    } 


    private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex) 
    { 
     Row row; 
     string cellReference = columnName + rowIndex; 
     if (worksheet.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) 
      row = worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex).FirstOrDefault(); 
     else 
     { 
      row = new Row() { RowIndex = rowIndex }; 
      worksheet.Append(row); 
     } 

     if (row == null) 
      return null; 

     if (row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).Count() > 0) 
     { 
      return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First(); 
     } 
     else 
     { 
      Cell refCell = null; 
      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) 
       { 
        refCell = cell; 
        break; 
       } 
      } 
      Cell newCell = new Cell() 
      { 
       CellReference = cellReference, 
       StyleIndex = (UInt32Value)1U 

      }; 
      row.InsertBefore(newCell, refCell); 
      worksheet.Save(); 
      return newCell; 
     } 
    } 

    #region ScriptResults declaration 
    /// <summary> 
    /// This enum provides a convenient shorthand within the scope of this class for setting the 
    /// result of the script. 
    /// 
    /// This code was generated automatically. 
    /// </summary> 
    enum ScriptResults 
    { 
     Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
     Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
    }; 
    #endregion 

} 

}

+0

デバッグしましたか?あなたのコードはすべて実行されていると確信していますか?何を試しましたか? –

答えて

1

問題は、あなたがSheetDataオブジェクトを作成していないということです。 ここにあなたがしなければならないことがあります。

これは、作成する必要がある方法を示すためのもので、「GetCell」メソッドはワークシートとSheetDataがすでに存在するかどうかをチェックし、存在しない場合はチェックする必要があります。

public static void UpdateCell(string docName, string text, uint rowIndex, string columnName) 
{ 
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
    { 
     WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, "Commercial"); 
     if (worksheetPart != null) 
     { 
      // Create new Worksheet 
      Worksheet worksheet = new Worksheet(); 
      worksheetPart.worksheet = worksheet; 

      // Create new SheetData 
      SheetData sheetData = new SheetData(); 

      // Create new row 
      Row row = new Row(){ RowIndex = rowIndex }; 

      // Create new cell 
      Cell cell = new Cell() { CellReference = columnName + rowIndex, DataType = CellValues.Number, CellValue = new CellValue(text) }; 

      // Append cell to row 
      row.Append(cell); 

      // Append row to sheetData 
      sheetData.Append(row); 

      // Append sheetData to worksheet 
      Worksheet.Append(sheetData); 

      worksheetPart.Worksheet.Save(); 
     } 
     spreadSheet.WorkbookPart.Workbook.Save(); 
    } 

} 
+0

これを達成するための参考になる:[link](https://msdn.microsoft.com/en-us/library/office/cc861607.aspx) – Miguel

関連する問題