【问题标题】:How do you check whether a cell is readonly in EXCEL using C#如何使用 C# 在 EXCEL 中检查单元格是否为只读
【发布时间】:2010-11-16 08:49:02
【问题描述】:

我正在将数据从数据库导入 Excel 工作表。为此,我正在使用数据阅读器。 excel工作表模板有一些宏和几个计算公式,它不是普通的excel工作表。所以只有在允许写入特定单元格的情况下,我才必须将数据写入 Excel 工作表。如果不是,则不应导入数据。

因此,为此,我有一个 XML 文件,其中说明我应该从哪一列开始写入以及应该在哪一行停止,我已经为许多工作表完成了此操作。但是在一张纸中,该行的第一个单元格是“只读的”(锁定的),其余的都是允许的写访问。

由于我使用 Datareader 从 DB 中获取了整行,因此我需要写入其他单元格,而无需写入锁定的单元格。

我附上代码 sn-p 以供参考。

请帮我做这件事。

示例::

 if (reader.HasRows)
  {
   minRow = 0;
    minCol = 0;
   Excel.Workbook SelWorkBook = excelAppln.Workbooks.Open(curfile, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, false, false, false);
    Excel.Sheets excelSheets = SelWorkBook.Worksheets;

 Excel.Worksheet excelworksheet = (Excel.Worksheet)excelSheets.get_Item(CurSheetName);

                                        // Process each result in the result set
                                        while (reader.Read())
                                        {
                                            // Create an array big enough to hold the column values
                                            object[] values = new object[reader.FieldCount];

                                            // Add the array to the ArrayList
                                            rowList.Add(values);

                                            // Get the column values into the array
                                            reader.GetValues(values);

                                            int iValueIndex = 0;

                                            // If the Reading Format is by ColumnByColumn 
                                            if (CurTaskNode.ReadFormat == "ColumnbyColumn")
                                            {
                                                minCol = 0;
                                                //   minRow = 0;
                                                for (int iCol = 0; iCol < CurTaskNode.HeaderData.Length; iCol++)
                                                {

                                                    // Checking whether the Header data exists or not
                                                    if (CurTaskNode.HeaderData[minCol] != "")
                                                    {
                                                        // Assigning the Value from reader to the particular cell in excel sheet
                                                        excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex];
                                                        iValueIndex++;

                                                    }
                                                    minCol++;
                                                }
                                                minRow++;
                                            }SelWorkBook.Close(true, curfile, null);

请帮我解决这个问题。

谢谢,

拉姆

【问题讨论】:

  • 您发布了一些代码,但您没有解释它的作用或为什么它不适合您?
  • 对不起,我忘了。如果阅读器有行,则这段代码会从 DB 中读取数据。然后打开一个新的预加载 excel 模板文件并将阅读器数据分配给 Values 对象。然后对于 XML 文件中的标题长度 (HeaderData.Length),它会写入每个 excel 单元格,最后保存文件并关闭。写入数据的位置是 excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex]; // 实际上需要检查一下这个是否写入单元格。我做不到。请帮助
  • 好的,我发布了一个新答案,试试看。

标签: c# excel datareader import


【解决方案1】:

好的,首先您需要检查第一个单元格的锁定属性,然后如果它被锁定,则对数组进行切片(这样您就可以得到整行减去第一列),然后写入工作表。这里有一些代码,不一定准确,SLICE 函数只是伪代码,C# 中对数组进行切片有多种不同的方法,请使用您选择的方法:

if (!excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + 1].Locked )
{
  excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex];
  iValueIndex++;
}
else
{
  excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values.SLICE(iValueIndex);
  iValueIndex++;
}

【讨论】:

  • 嗨 Lance,这没有成功。如果我使用它,它说范围不能像这样使用...它是一个对象..但像变量一样使用因为我正在使用 Datareader 和它从数据库中读取整行,它还将整行写入 excelsheet。因此,它将写入该行中的其他单元格。我的请求仅跳过第一行中的第一个单元格。并在第一行写下其余的单元格。从第二行开始,它是正常的..为第二行中的所有单元格写入。请帮我修改代码。
  • 好的,我将不得不更深入地研究它,但这可能需要我一点时间。我将暂时保留答案,以免有人复制它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2020-07-28
  • 1970-01-01
  • 2016-01-30
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多