C# 为什么我的电子表格以.xlsx扩展名保存,但却被赢得';在我将其更改为.xls之前不会发生?
我打开一个现有的.xlsx文件,对其进行更改,然后将其保存回磁盘。更改正在运行,但当我尝试打开文件时(手动,在Windows资源管理器中单击2次),我会得到“Excel无法打开文件'Bla.xlsx',因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。” 如果我将扩展名从“xlsx”更改为“xls”,它将正常打开。但是原始文件是.xlsx,我想保持这种方式。这是我的密码:C# 为什么我的电子表格以.xlsx扩展名保存,但却被赢得';在我将其更改为.xls之前不会发生?,c#,excel,xls,xlsx,excel-interop,C#,Excel,Xls,Xlsx,Excel Interop,我打开一个现有的.xlsx文件,对其进行更改,然后将其保存回磁盘。更改正在运行,但当我尝试打开文件时(手动,在Windows资源管理器中单击2次),我会得到“Excel无法打开文件'Bla.xlsx',因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。” 如果我将扩展名从“xlsx”更改为“xls”,它将正常打开。但是原始文件是.xlsx,我想保持这种方式。这是我的密码: // Open the file MSExcel.Excel.ApplicationCl
// Open the file
MSExcel.Excel.ApplicationClass xlApp = new MSExcel.Excel.ApplicationClass();
MSExcel.Excel.Workbook xlBook = xlApp.Workbooks.Open(sourceFilename, 0, false, 5, null, null, false, MSExcel.Excel.XlPlatform.xlWindows, null, true, false, 0, true, false, false);
MSExcel.Excel.Sheets xlSheets = xlBook.Worksheets;
MSExcel.Excel.Worksheet xlSheet = (MSExcel.Excel.Worksheet)xlSheets.Item[1];
// Change the file
MSExcel.Excel.Range priceTypeCell = (MSExcel.Excel.Range)xlSheet.Cells[7, 3];
//if (priceTypeCell.Value2.ToString() == "Price Push") <= This is probably fine, but just in case...
if (priceTypeCell.Value2.ToString().Trim().Contains("Price Push"))
{
priceTypeCell.Value2 = "Price Type";
}
// Save the file - example code showed xlWorkbookDefault, but that either never existed or
// has been deprecated; xlWorkbookNormal is what I chose from the limited available options
xlApp.DisplayAlerts = false; // Was prompting about overwriting the existing file
xlBook.SaveAs(sourceFilename, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, Type.Missing, Type.Missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlBook.Close();
更新2
当我尝试使用“xlExcel9795”时,它甚至无法保存它。我得到:
System.Runtime.InteropServices.COMException was unhandled
HResult=-2146827284
Message=Exception from HRESULT: 0x800A03EC
Source=Microsoft.Office.Interop.Excel
ErrorCode=-2146827284
StackTrace:
at Microsoft.Office.Interop.Excel.WorkbookClass.SaveAs(Object Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local)
at PricePushETLProcess.PricePushFile.ChangeColumnHeaderVal(PricePushFile ppf) in . . .
您正在将其保存为Excel 95-请参见: 将Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7更改为更新的格式 我相信最新的格式应该是Excel.XlFileFormat.xlOpenXMLWorkbook
xlBook.SaveAs(sourceFilename, Type.Missing, Type.Missing, Type.Missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
(平底船)
IOW,而不是指定Excel文件的类型,只需在调用SaveAs()的第二个参数中指定“type.Missing”,将其保留为空或默认值即可
下面是整个该死的事情:
public void ChangeColumnHeaderVal()
{
MSExcel.Excel.ApplicationClass xlApp = null;
MSExcel.Excel.Workbook xlBook = null;
MSExcel.Excel.Worksheet xlSheet = null;
try
{
// Open the file
xlApp = new MSExcel.Excel.ApplicationClass();
xlBook = xlApp.Workbooks.Open(sourceFilename, 0, false, 5, null, null, false, MSExcel.Excel.XlPlatform.xlWindows, null, true, false, 0, true, false, false);
var xlSheets = xlBook.Worksheets;
//Get the first Sheet
xlSheet = (MSExcel.Excel.Worksheet)xlSheets.Item[1];
// Change the file
MSExcel.Excel.Range priceTypeCell = (MSExcel.Excel.Range)xlSheet.Cells[7, 3];
//if (priceTypeCell.Value2.ToString() == "Price Push") <= This is probably fine, but just in case...
if (priceTypeCell.Value2.ToString().Trim().Contains("Price Push"))
{
priceTypeCell.Value2 = "Price Type";
}
// Save the file
xlApp.DisplayAlerts = false; // Was prompting about overwriting the existing file
xlBook.SaveAs(sourceFilename, Type.Missing, Type.Missing, Type.Missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlBook.Close();
}
finally
{
// Cleanup
if (xlSheet != null) Marshal.ReleaseComObject(xlSheet);
if (xlBook != null) Marshal.ReleaseComObject(xlBook);
if (xlApp != null) xlApp.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
public void ChangeColumnHeaderVal()
{
MSExcel.Excel.ApplicationClass xlApp=null;
MSExcel.Excel.工作簿xlBook=null;
MSExcel.Excel.Worksheet xlSheet=null;
尝试
{
//打开文件
xlApp=new MSExcel.Excel.ApplicationClass();
xlBook=xlApp.Workbooks.Open(sourceFilename,0,false,5,null,null,false,MSExcel.Excel.XlPlatform.xlWindows,null,true,false,0,true,false,false);
var xlSheets=xlBook.Worksheets;
//拿到第一张
xlSheet=(MSExcel.Excel.Worksheet)xlSheets.Item[1];
//更改文件
MSExcel.Excel.Range priceTypeCell=(MSExcel.Excel.Range)xlSheet.Cells[7,3];
//如果(priceTypeCell.Value2.ToString()==“价格推送”),则离此还有两步之遥!
public void ChangeColumnHeaderVal()
{
MSExcel.Excel.ApplicationClass xlApp = null;
MSExcel.Excel.Workbook xlBook = null;
MSExcel.Excel.Worksheet xlSheet = null;
try
{
// Open the file
xlApp = new MSExcel.Excel.ApplicationClass();
xlBook = xlApp.Workbooks.Open(sourceFilename, 0, false, 5, null, null, false, MSExcel.Excel.XlPlatform.xlWindows, null, true, false, 0, true, false, false);
var xlSheets = xlBook.Worksheets;
//Get the first Sheet
xlSheet = (MSExcel.Excel.Worksheet)xlSheets.Item[1];
// Change the file
MSExcel.Excel.Range priceTypeCell = (MSExcel.Excel.Range)xlSheet.Cells[7, 3];
//if (priceTypeCell.Value2.ToString() == "Price Push") <= This is probably fine, but just in case...
if (priceTypeCell.Value2.ToString().Trim().Contains("Price Push"))
{
priceTypeCell.Value2 = "Price Type";
}
// Save the file
xlApp.DisplayAlerts = false; // Was prompting about overwriting the existing file
xlBook.SaveAs(sourceFilename, Type.Missing, Type.Missing, Type.Missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlBook.Close();
}
finally
{
// Cleanup
if (xlSheet != null) Marshal.ReleaseComObject(xlSheet);
if (xlBook != null) Marshal.ReleaseComObject(xlBook);
if (xlApp != null) xlApp.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}