【发布时间】:2014-01-03 13:43:10
【问题描述】:
我仍然卡在这段代码中,并且错误不断出现.. 我有几乎 24 列的 excel 文件,我正在尝试将其调整为 7 列的 excel 文件,因为我拥有的软件仅适用于 7 列,我不想从头开始重新编写软件,所以你会查看一些列的删除和插入..
我在这个 excel 文件中有 5 列有“x”值或空值。
我要做的是在范围 A1 和 B1 之间创建一个称为类别的新列,因此如果第 5 列中有 x,我在类别字段中写 E,否则如果 x 在第 6 列然后我在类别列中写 P.. 等等。 然后我需要删除我不再需要的这 5 列(范围 E1:I1)
问题是当我调试代码时,我可以看到 values[,] 插入了列,并且值已经正确传输,但是当 temp_data.csv 生成时,它有新的 excel 文件之后删除,所以现在它包含 11 列,但新的 Category 列和值都不存在...
Microsoft.Office.Interop.Excel.Workbook workbook = xl.Workbooks.Open(p_sUBKPath, Type.Missing, false, 4, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1];
Microsoft.Office.Interop.Excel.Range range = ws.UsedRange;
// delete columns that we don't need from the new excel file
Microsoft.Office.Interop.Excel.Range range2 = ws.get_Range("A1","A1");
range2.EntireColumn.Delete();
Microsoft.Office.Interop.Excel.Range range3 = ws.get_Range("B1", "B1");
range3.EntireColumn.Delete();
Microsoft.Office.Interop.Excel.Range range4 = ws.get_Range("D1", "L1");
range4.EntireColumn.Delete();
Microsoft.Office.Interop.Excel.Range range5 = ws.get_Range("I1", "M1");
range5.EntireColumn.Delete();
Microsoft.Office.Interop.Excel.Range range6 = ws.get_Range("K1", "K1");
range6.EntireColumn.Delete();
//insert a new column ( Category)
Microsoft.Office.Interop.Excel.Range range7 = ws.get_Range("B1", "B1");
range7.EntireColumn.Insert(XlInsertShiftDirection.xlShiftToRight);
object[,] tempVal = (object[,])range.Value2;
tempVal[1, 2] = (object)"Category";
for (int row = 2; row <= tempVal.GetUpperBound(0); row++)
{
try
{
if ((!String.IsNullOrEmpty((string)tempVal[row, 5])) && (string)tempVal[row, 5] == "x")
{
tempVal[row, 2] = (string)"E";
}
else if ((!String.IsNullOrEmpty((string)tempVal[row, 6])) && (string)tempVal[row, 6] == "x")
{
tempVal[row, 2] = (string)"P";
}
else if ((!String.IsNullOrEmpty((string)tempVal[row, 7])) && (string)tempVal[row, 7] == "x")
{
tempVal[row, 2] = (string)"Phy";
}
else if ((!String.IsNullOrEmpty((string)tempVal[row, 8])) && (string)tempVal[row, 8] == "x")
{
tempVal[row, 2] = (string)"L";
}
else if ((!String.IsNullOrEmpty(tempVal[row, 9].ToString())) && (string)tempVal[row, 9] == "x")
{
tempVal[row, 2] = (string)"Ex";
}
else
MessageBox.Show("unknow");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
object[,] values = tempVal;
if (Convert.ToString(values[1, 1]).ToUpper().Trim() == "SHORT NAME" && Convert.ToString(values[1, 2]).ToUpper().Trim() == "CATEGORY" && Convert.ToString(values[1, 3]).ToUpper().Trim() == "LONG NAME EN" && Convert.ToString(values[1, 4]).ToUpper().Trim() == "LONG NAME DE" && Convert.ToString(values[1, 5]).ToUpper().Trim() == "ELEMENT" && Convert.ToString(values[1, 6]).ToUpper().Trim() == "PROPERNAME" && Convert.ToString(values[1, 7]).ToUpper().Trim() == "PHYSICAL" && Convert.ToString(values[1, 8]).ToUpper().Trim() == "LOGICAL" && Convert.ToString(values[1, 9]).ToUpper().Trim() == "EXTENSION" && Convert.ToString(values[1, 10]).ToUpper().Trim() == "CREATED BY" && Convert.ToString(values[1, 11]).ToUpper().Trim() == "CREATED ON" && Convert.ToString(values[1, 12]).ToUpper().Trim() == "STATE")
{
for (int row = 1; row <= values.GetUpperBound(0); row++)
for (int col = 1; col <= values.GetUpperBound(1); col++)
{
string value = Convert.ToString(values[row, col]);
if (value.Contains(","))
{
range.Cells.set_Item(row, col, value.Replace(",", p_sPsuedostring));
}
if (value.Contains(" "))
{
range.Cells.set_Item(row, col, value.Replace(" ", p_sPsuedostring + " " + p_sPsuedostring));
}
}
if (File.Exists(System.Windows.Forms.Application.StartupPath + @"\Data_Temp.csv"))
File.Delete(System.Windows.Forms.Application.StartupPath + @"\Data_Temp.csv");
//Save the Latest databse as Data_Temp.csv
ws.SaveAs(System.Windows.Forms.Application.StartupPath + @"\Data_Temp.csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlUnicodeText, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xl.DisplayAlerts = true;
try
{
xl.Workbooks[1].Close(false, Type.Missing, Type.Missing);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
xl.Application.Quit();
xl.Quit();
l_bClosedSuccessfully = true;
【问题讨论】:
-
我有几个问题
1为什么要在插入“类别”列之前删除列2多个列可以有“x”还是只有1列?3如果您的第 7 列有“X”,那么您为什么在类别列中写“Phy”?不应该是“G”吗? -
请记住,当您删除 Col A 时,当前的 Col B 会变为 Col A。那么,在实际删除它们之前,您能告诉我您要删除的列的名称吗?
-
亲爱的 Siddharth,我实际上是在删除我不需要的列(不包括包含 x 值的列),它们只是额外的列。 '2' 对于 5 列之一中的每一行只有一个 x,因此对于单行,x 只能出现在这 5 列之间的一列中。 '3' p 和 phy 和 E 是与我的项目相关的值,例如 E 表示元素,PHY 表示物理..etc
-
ok 你能告诉我这些列的名称吗?即在它们被删除之前...
-
域名是文件中的第一列,但我删除了它并手动跟踪文件以查看发生的范围变化。我的意思是我知道当我删除 E 时,代码会向后移动,我必须从头开始计数
标签: c# excel office-interop