Не работает оператор AS при выводе в excel из таблицы mysql
private static void ReleaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
public static void CreateReport(string cmd, string finame, string _finame, string folderstr, string conn, bool OpenAftCreate)
{
FileInfo fi = new FileInfo(folderstr);
if (fi.Exists)
{
DialogResult result = MessageBox.Show(
"Файл уже существует. Заменить?",
"Сообщение",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly);
//System.Diagnostics.Process.Start(FolderStr);
if (result == DialogResult.Yes)
{
fi.Delete();
}
else { return; }
}
MySqlConnection cnn;
string sql = null;
string data = null;
int i = 0;
int j = 0;
string path = Environment.CurrentDirectory;
//ErrDataMsg("", path);
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
cnn = new MySqlConnection(conn);
cnn.Open();
sql = cmd;
MySqlDataAdapter dscmd = new MySqlDataAdapter(sql, cnn);
DataSet ds = new DataSet();
dscmd.Fill(ds);
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
{
data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
xlWorkSheet.Cells[i + 1, j + 1] = data;
}
}
try
{
xlWorkBook.SaveAs(finame, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
}
catch { ErrDataMsg("Ошибка", "Не удалось получить доступ к файлу"); };
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
ReleaseObject(xlWorkSheet);
ReleaseObject(xlWorkBook);
ReleaseObject(xlApp);
MessageBox.Show("Объект успешно создан в папке документы");
if (OpenAftCreate)
{
System.Diagnostics.Process.Start("C:\\Users\\" + Environment.UserName + "\\Documents\\" + _finame);
}
}
string pqsum = "select FullName as ФИО, Pnum as Номер, zp as ЗП, _month as Месяц from Payts;";
private void MonRep_Click(object sender, EventArgs e)
{
CreateReport(pqsum, @"ИТОГИ", s_finame, sFolderStr, conn, OpenAftCreate.Checked);
}
У меня есть идея как это сделать, для этого нужно будет как-бы "слепить" запросом 2 таблицы, в одной из которых будут хранится имена столбцов, а в другой сами данные, но я не знаю как такое сделать и можно ли вообще. На скрине видно, что имен у столбцов нет.
Ответы (1 шт):
можно пойти как минимум двумя путями. первый, наверное, более корректный будет отдельным запросом выбрать и вписать в тело таблицы заголовки.
второй - вы можете использовать оператор UNION и выбрать первой строкой заголовки таблицы (тут вообще вопрос, обязательно ли строка заголовков, выбранная первым select будет идти первой в результирующем наборе. в целом подозреваю, это не гарантируется).
Второй нюанс - заголовки это строки, поэтому все поля во втором селекте данных также придется приводить к строковым типам данных.
SELECT 'name' AS name
,'phone' as phone
,'int_value' as someIntField
UNION
SELECT name, phone, cast(int_col as varchar)